丢弃包的现有状态 - Oracle

kal*_*lls 3 oracle

我正在使用 Oracle 并且我修改了一些触发器和包上的代码。当我运行修改代码的脚本文件并尝试对表(触发触发器)进行更新时,我正在丢弃现有的包状态

我收到一堆错误

ORA-04068:
ORA-04061:
ORA-04065:
ORA-06512:--Trigger error -- line 50
ORA-04088:
Run Code Online (Sandbox Code Playgroud)

此错误仅在第一次发生。任何避免这种情况的输入将不胜感激。谢谢!

Ton*_*him 5

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;
Run Code Online (Sandbox Code Playgroud)

改为这样做

function foo return varchar2 DETERMINISTIC is
begin
  result:=... --expensive calc here
  return result;
end foo;
Run Code Online (Sandbox Code Playgroud)

确定性告诉 Oracle 对于给定的输入,结果不会改变,因此它可以缓存结果并避免调用该函数。

如果这不是您的用例,并且您需要跨会话共享变量,请使用表并查询它。如果您的表以任何频率使用,它最终将位于缓冲区缓存中,因此您可以获得所需的内存存储,而不会出现会话变量的问题