Простейшая рекурсия plpgsql

Здравствуйте!
Являюсь новичком в изучении 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); .

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023