Необходимо закрыть возвращенный рефкурсор из хранимой функции plpgsql или нет?
Используя PostgreSQL, я сохраняю функцию, используя следующую структуру:
create or replace function myfunc() returns refcursor as $$
declare rc refcursor := 'mycursor';
-- ...
begin;
-- ...
open rc for select ...;
return rc;
end; $$ language plpgsql;
Это возвращает курсор, который я использую в обязательной транзакции. Который я использую так:
begin;
select myfunc();
fetch all in mycursor;
close mycursor;
commit;
Но в большинстве примеров и учебных пособий утверждение close mycursor;
просто опущен. Я знаю, что вам нужно закрыть его при внутреннем использовании в функции, но когда он вернется, возможно, commit;
автоматически закрывает любые открытые курсоры? Итак, действительно ли нужно закрывать курсор?
Не уверен, как проверить, открыт ли он после commit;
так как курсор больше не находится в области видимости.
1 ответ
ЗАКРЫТЬ закрывает портал под открытым курсором. Это может быть использовано для освобождения ресурсов раньше, чем конец транзакции, или для освобождения переменной курсора, которая будет открыта снова.
Ты можешь использовать close cursor_name
за releasing resources earlier than end of transaction
, так что если вы не закроете курсор и end
или же commit
тогда ваша транзакция не должна иметь никакого значения.