Здравствуйте!
Являюсь новичком в изучении Postgresql. Попытался написать простую рекурсивную функцию, которая должна была по замыслу уменьшать переданное ей число за каждый рекурсивный ее вызов на единицу пока число не станет равно 0 и вернуть последнее значение модифицируемого числа (то есть вернуть 0).
CREATE or replace function temp (integer)
returns integer
as
$$
------------------------------------------------------------------------------
DECLARE
a integer;
glob integer;
------------------------------------------------------------------------------
BEGIN
a:=$1-1;
if a>0 then RAISE NOTICE 'a=%', a; perform temp(a);
else glob:=a;RAISE NOTICE 'glob=%',glob;
end if;
RAISE NOTICE 'glob=%',glob;
return glob;
END;
-------------------------------------------------------------------------------
$$
language 'plpgsql'
При вызове функции: select temp(5) - результат: null
Вот лог ее выполнения:
...
a=4
a=3
a=2
a=1
glob=0
glob=0
glob=
glob=
glob=
glob=
...
Из лога понятно, почему возвращается null. Но мне вот надо что-то наподобие "глобальной" переменной, значение которой по моему предположению должна была играть переменная glob, но не тут то было...Все переменные тут выступают в роли "локальных" и возвращается естественно последняя... co значением NULL. Если возможность как-то запомнить значение glob=0, чтобы вернуть функция вернула именно его???
Спасибо, меня натолкнули на
Спасибо, меня натолкнули на мысль. perform temp(a); - выполняется для каждого вызова функции и продолжает двигаться дальше по телу функции, возвращаясь из вложенного рекурсивного вызова, в итоге return возвращает первоначальное значение glob. Поэтому чтобы прекратить дальнейший проход из рекурсий верхних уровней и вернуть нужное значение - самого последнего вызова, надо было использовать return temp(a); .