serially_reusable 只对常量包变量有意义。
只有一种方法可以避免此错误并保持性能(reset_package 确实不是一个好的选择)。避免在您的 PL/SQL 包中使用任何包级变量。您的 Oracle 的服务器内存不是存储状态的正确位置。
如果某些东西确实没有改变,计算成本很高,并且函数的返回值可以反复重用而无需重新计算,那么 DETERMINISTIC 在这方面会有所帮助
示例:不要这样做:
varchar2(100) 缓存结果;
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;
Deterministic 告诉 Oracle,对于给定的输入,结果不会改变,因此它可以缓存结果并避免调用函数。
如果这不是您的用例,并且您需要跨会话共享变量,请使用表并查询它。如果您的表以任何频率使用,它最终会在缓冲区缓存内存中,因此您可以获得所需的内存存储,而不会出现会话变量的问题