Změny

Přejít na: navigace, hledání

Časté chyby v PL/pgSQL

Přidáno 4 370 bajtů, 26. 3. 2013, 11:16
SELECT least($1,$2);
$$ LANGUAGE sql;
</pre>
PL/pgSQL není optimalizovaný na rekurzivní volání - nepoužívejte PL/pgSQL na hluboká rekurzivní volání, používejte nerekurzivní algoritmy
<pre>
CREATE OR REPLACE FUNCTION public.psqlfibnr(n integer)
RETURNS integer
LANGUAGE plpgsql
IMMUTABLE STRICT
AS $function$
DECLARE
prev1 int = 0;
prev2 int = 1;
result int = 0;
BEGIN
FOR i IN 1..n
LOOP
result := prev1 + prev2;
prev2 := prev1;
prev1 := result;
END LOOP;
RETURN result;
END;
$function$
 
CREATE OR REPLACE FUNCTION public.psqlfibr(n integer)
RETURNS integer
LANGUAGE plpgsql
IMMUTABLE STRICT
AS $function$
BEGIN
IF n < 2 THEN
RETURN n;
END IF;
RETURN psqlfib(n-1) + psqlfib(n-2);
END;
$function$
 
postgres=# select n, psqlfibnr(n)
from generate_series(0,35,5) as n;
n | psqlfibnr
----+-----------
0 | 0
5 | 5
10 | 55
15 | 610
20 | 6765
25 | 75025
30 | 832040
35 | 9227465
(8 rows)
 
Time: 1.178 ms
 
postgres=# select n, psqlfibr(n)
from generate_series(0,35,5) as n;
n | psqlfib
----+---------
0 | 0
5 | 5
10 | 55
15 | 610
20 | 6765
25 | 75025
30 | 832040
35 | 9227465
(8 rows)
Time: 282992.820 ms
</pre>
Správce, byrokrat, editor, reviewer
1 948
editací