Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- declare
- n number;
- temp number;
- sum number := 1;
- begin
- n := &n;
- temp := n;
- while temp>0 loop
- sum := temp*sum;
- temp := temp-1;
- end loop;
- dbms_output.put_line('Factorial of '||n||' is '||sum);
- end;
- /
- declare
- n number;
- temp number;
- sum_ number := 1;
- begin
- n := &n;
- temp := n;
- while temp>0 loop
- sum_ := temp*sum_;
- temp := temp-1;
- end loop;
- dbms_output.put_line('Factorial of '||n||' is '||sum_);
- end;
- /
- select round(exp(sum(ln(level))))
- from dual
- connect by level <= 5;
- create or replace package test_ is
- function by_query(num number) return number deterministic;
- function by_plsql(num number) return number deterministic;
- end test_;
- /
- create or replace package body test_ is
- function by_query(num number) return number deterministic
- is
- res number;
- begin
- select round(exp(sum(ln(level))))
- into res
- from dual
- connect by level <= num;
- return res;
- end;
- function by_plsql(num number) return number deterministic
- is
- n number := 0;
- begin
- for i in 1..num loop
- n := n + ln(i);
- end loop;
- return round(exp(n));
- end;
- end test_;
- declare
- dummy number;
- begin
- for i in 1..10000 loop
- dummy := test_.by_query(5);
- end loop;
- end;
- declare
- dummy number;
- begin
- for i in 1..10000 loop
- dummy := test_.by_plsql(5);
- end loop;
- end;
- declare
- n number;
- i number;
- sum_of_log_10s number;
- exponent number;
- base number;
- begin
- n := &n;
- i := 1;
- sum_of_log_10s := 0;
- while i <= n loop
- -- do stuff
- sum_of_log_10s := sum_of_log_10s + log(10,i);
- i := i + 1;
- end loop;
- dbms_output.put_line('sum of logs = '||sum_of_log_10s);
- exponent := floor(sum_of_log_10s);
- base := power(10,sum_of_log_10s - exponent);
- dbms_output.put_line(n||'! = '||base||' x 10^'||exponent);
- end;
- ALTER SESSION FORCE PARALLEL DDL PARALLEL 16;
- ALTER SESSION FORCE PARALLEL DML PARALLEL 16;
- ALTER SESSION FORCE PARALLEL QUERY PARALLEL 16;
- with t as (
- select /*+materialize*/
- rownum i
- from dual connect by rownum < 100000 -- put number to calculate n! here
- )
- ,t1 as (
- select /*+parallel(t,16)*/ /*+materialize*/
- sum(log(10,i)) logsum
- from t
- )
- select
- trunc(power(10,(mod(logsum,1))),3) ||' x 10^'||trim(to_char(floor(logsum),'999,999,999,999')) factorial
- -- logsum
- from t1
- ;
- FUNCTION Factorial(num INTEGER) return NUMBER deterministic is
- n NUMBER := num;
- --
- begin
- for i in REVERSE 2..num-1 loop
- n := n * i;
- end loop;
- --
- return n;
- end Factorial;
Add Comment
Please, Sign In to add comment