Possible?? Yes, just like the model clause..
Below, the two queries contain algorithms written in a recursive version:
- Fibonacci sequence
- Factorial
- Euclid's algorithm for determining the greatest common divisor (GCD)
Two techniques are presented:
- iterative models - are perfect for implementing unary recursive functions, and their notation is almost intuitive. Unfortunately, with a larger number of parameters, problems arise with cyclical cell enumeration
- non-iterative models - formulas are a bit more complicated, but multi-argument functions can be handled
d , f AS FIBBONACCI,
S AS FACTORIAL
FROM (SELECT 0 d FROM DUAL)
MODEL
DIMENSION BY (0 d)
MEASURES (0 f, 0 s)
RULES
ITERATE (100) UNTIL (ITERATION_NUMBER = 50)
(f [ITERATION_NUMBER] =
CASE ITERATION_NUMBER
WHEN 0 THEN 0
WHEN 1 THEN 1
ELSE
f[ITERATION_NUMBER - 2] + f[ITERATION_NUMBER - 1]
END,
s [ITERATION_NUMBER] =
CASE ITERATION_NUMBER
WHEN 0 THEN 1
ELSE
ITERATION_NUMBER * s[ITERATION_NUMBER - 1]
END)
The example below can be simplified a bit :)
SELECT L1, L2, GCD
FROM (SELECT L1, l2
FROM ( SELECT LEVEL - 1 L1
FROM DUAL
CONNECT BY LEVEL <= 20),
( SELECT LEVEL - 1 L2
FROM DUAL
CONNECT BY LEVEL <= 20))
MODEL
DIMENSION BY (L1, L2)
MEASURES (0 GCD)
RULES SEQUENTIAL ORDER
(GCD [ANY, ANY] =
CASE
WHEN CV (l2) = 0 AND CV (L1) =0
THEN
1
WHEN CV (l2) = 0 OR CV (L1) =0
THEN
GREATEST(CV (l1), CV(l2))
WHEN CV (l2) <= CV (l1)
THEN
GCD[CV (l2), MOD (CV (l1), CV (l2))]
END,
GCD[ANY, ANY] =
CASE
WHEN CV (l2) > CV (l1) THEN
GCD[CV (l2), CV (l1)]
ELSE GCD[CV (l1), CV (l2)]
END)