法1:CONNECT BY結合使用DBMS_AW.EVAL_NUMBER
SELECT dbms_aw.eval_number(substr(sys_connect_by_path(LEVEL, '*'), 2)) f
FROM dual
WHERE connect_by_isleaf = 1
CONNECT BY LEVEL <= 10;
法2:利用對數運算法則(積的對數等於對數的和)
SELECT power(10, SUM(log(10, LEVEL))) FROM dual CONNECT BY LEVEL <= 10;
法3:利用遞歸子查詢
WITH factorial(n, f) AS
(SELECT 1 n, 1 f
FROM dual
UNION ALL
SELECT n + 1, f * (n + 1)
FROM factorial
WHERE n < 10)
SELECT MAX(f) f FROM factorial;
法4:MODEL子句迭代器
WITH factorial AS
(SELECT n, f
FROM (SELECT LEVEL n FROM dual CONNECT BY LEVEL <= 10)
MODEL RETURN UPDATED ROWS
DIMENSION BY(n) MEASURES(0 f)
RULES ITERATE(10)
(f[n] ORDER BY n = presentv(f[cv(n) - 1], f[cv(n) - 1], 1) * cv(n)))
SELECT MAX(f) FROM factorial;