Guest User

Untitled

a guest
Jan 17th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. declare
  2. n number;
  3. temp number;
  4. sum number := 1;
  5. begin
  6. n := &n;
  7. temp := n;
  8. while temp>0 loop
  9. sum := temp*sum;
  10. temp := temp-1;
  11. end loop;
  12. dbms_output.put_line('Factorial of '||n||' is '||sum);
  13. end;
  14. /
  15.  
  16. declare
  17. n number;
  18. temp number;
  19. sum_ number := 1;
  20. begin
  21. n := &n;
  22. temp := n;
  23. while temp>0 loop
  24. sum_ := temp*sum_;
  25. temp := temp-1;
  26. end loop;
  27. dbms_output.put_line('Factorial of '||n||' is '||sum_);
  28. end;
  29. /
  30.  
  31. select round(exp(sum(ln(level))))
  32. from dual
  33. connect by level <= 5;
  34.  
  35. create or replace package test_ is
  36.  
  37. function by_query(num number) return number deterministic;
  38.  
  39. function by_plsql(num number) return number deterministic;
  40.  
  41. end test_;
  42.  
  43. /
  44.  
  45. create or replace package body test_ is
  46.  
  47. function by_query(num number) return number deterministic
  48. is
  49. res number;
  50. begin
  51. select round(exp(sum(ln(level))))
  52. into res
  53. from dual
  54. connect by level <= num;
  55.  
  56. return res;
  57. end;
  58.  
  59. function by_plsql(num number) return number deterministic
  60. is
  61. n number := 0;
  62. begin
  63. for i in 1..num loop
  64. n := n + ln(i);
  65. end loop;
  66.  
  67. return round(exp(n));
  68. end;
  69.  
  70. end test_;
  71.  
  72. declare
  73. dummy number;
  74. begin
  75. for i in 1..10000 loop
  76. dummy := test_.by_query(5);
  77. end loop;
  78. end;
  79.  
  80. declare
  81. dummy number;
  82. begin
  83. for i in 1..10000 loop
  84. dummy := test_.by_plsql(5);
  85. end loop;
  86. end;
  87.  
  88. declare
  89. n number;
  90. i number;
  91. sum_of_log_10s number;
  92. exponent number;
  93. base number;
  94.  
  95. begin
  96. n := &n;
  97.  
  98. i := 1;
  99. sum_of_log_10s := 0;
  100.  
  101. while i <= n loop
  102. -- do stuff
  103. sum_of_log_10s := sum_of_log_10s + log(10,i);
  104. i := i + 1;
  105. end loop;
  106.  
  107. dbms_output.put_line('sum of logs = '||sum_of_log_10s);
  108.  
  109. exponent := floor(sum_of_log_10s);
  110.  
  111. base := power(10,sum_of_log_10s - exponent);
  112.  
  113. dbms_output.put_line(n||'! = '||base||' x 10^'||exponent);
  114.  
  115. end;
  116.  
  117. ALTER SESSION FORCE PARALLEL DDL PARALLEL 16;
  118. ALTER SESSION FORCE PARALLEL DML PARALLEL 16;
  119. ALTER SESSION FORCE PARALLEL QUERY PARALLEL 16;
  120.  
  121. with t as (
  122. select /*+materialize*/
  123. rownum i
  124. from dual connect by rownum < 100000 -- put number to calculate n! here
  125. )
  126. ,t1 as (
  127. select /*+parallel(t,16)*/ /*+materialize*/
  128. sum(log(10,i)) logsum
  129. from t
  130. )
  131. select
  132. trunc(power(10,(mod(logsum,1))),3) ||' x 10^'||trim(to_char(floor(logsum),'999,999,999,999')) factorial
  133. -- logsum
  134. from t1
  135. ;
  136.  
  137. FUNCTION Factorial(num INTEGER) return NUMBER deterministic is
  138. n NUMBER := num;
  139. --
  140. begin
  141. for i in REVERSE 2..num-1 loop
  142. n := n * i;
  143. end loop;
  144. --
  145. return n;
  146. end Factorial;
Add Comment
Please, Sign In to add comment