serially_reusable имеет смысл только для константных переменных пакета.
Существует только один способ избежать этой ошибки и сохранить производительность (reset_package действительно не очень хороший вариант). Избегайте любых переменных уровня пакета в ваших пакетах PL / SQL. Серверная память вашего Oracle не подходит для хранения состояния.
Если что-то действительно не меняется, это дорого вычислять и возвращаемое значение из функции может многократно использоваться снова и снова без перерасчета, тогда DETERMINISTIC помогает в этом отношении
пример: НЕ ДЕЛАЙТЕ ЭТОГО:
varchar2 (100) cached_result;
function foo return varchar2 is
begin
if cached_result is null then
cached_result:= ... --expensive calc here
end if;
return cached_result;
end foo;
СДЕЛАЙТЕ ЭТО ВМЕСТО
function foo return varchar2 DETERMINISTIC is
begin
result:=... --expensive calc here
return result;
end foo;
Детерминист сообщает Oracle, что для данного ввода результат не изменяется, поэтому он может кэшировать результат и избегать вызова функции.
Если это не ваш вариант использования, и вам нужно совместно использовать переменную между сеансами, используйте таблицу и запросите ее. Ваша таблица попадет в буферную кеш-память, если она будет использоваться с любой частотой, поэтому вы получите желаемое хранилище без проблем с переменными сеанса