法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;