Oracle SQL實現階乘的幾個方法

regonly1發表於2010-06-07
第一個:字串疊加運演算法
原理是先將要相乘的數用字串拼接起來,然後將拼接的逗號替換為乘號,再用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不希望自己來處理這種問題了,只需要對外提供介面讓人們自己去實現好了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-664600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章