Oracle SQL实现阶乘的几个方法

转自:http://hi.baidu.com/%D0%C7%B9%E2%CF%C2%B5%C4%D0%A1%C7%C7/blog/item/c8b254322c2e8a5c251f148e.html

Oracle SQL实现阶乘的几个方法2011-01-11 9:48第一个:字符串叠加运算法
原理是先将要相乘的数用字符串拼接起来,然后将拼接的逗号替换为乘号,再用dbms_aw.evel_number函数对字符串运算,即可得所求结果:
SQL> select rownum rn, dbms_aw.eval_number(replace(wmsys.wm_concat(rownum)over(order by rownum), ',', '*')) serial_multi
  2    from dual connect by rownum <= 12
  3  /

        RN SERIAL_MULTI
---------- ------------
         1            1
         2            2
         3            6
         4           24
         5          120
         6          720
         7         5040
         8        40320
         9       362880
        10      3628800
        11     39916800
        12    479001600

12 rows selected

第二种:指数运算法。
这个方法在以前的blog中已经举例过。原理上不再做说明了。
SQL> select rownum rn, power(10, sum(log(10, rownum))over(order by rownum)) serial_mul,
  2         sum(rownum)over(order by rownum) serial_add
  3    from dual connect by rownum <= 12
  4  /

        RN SERIAL_MUL SERIAL_ADD
---------- ---------- ----------
         1          1          1
         2          2          3
         3          6          6
         4         24         10
         5        120         15
         6        720         21
         7       5040         28
         8      40320         36
         9     362880         45
        10    3628800         55
        11   39916800         66
        12  479001600         78

12 rows selected

第三种:自定义聚集函数法
这个方法与字符串相加是同一个原理。也就是调用oracle的聚集函数接口来实现数字的连乘。这里不再做多说明。需要注意的是,为何Oracle提供了sum却不提供类似连加的连乘法呢?个人估计是连乘法结果太大,Oracle不希望自己来处理这种问题了,只需要对外提供接口让人们自己去实现好了。

你可能感兴趣的:(Oracle SQL)