我正在使用 Oracle 并且我修改了一些触发器和包上的代码。当我运行修改代码的脚本文件并尝试对表(触发触发器)进行更新时,我正在丢弃现有的包状态
我收到一堆错误
ORA-04068:
ORA-04061:
ORA-04065:
ORA-06512:--Trigger error -- line 50
ORA-04088:
Run Code Online (Sandbox Code Playgroud)
此错误仅在第一次发生。任何避免这种情况的输入将不胜感激。谢谢!
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 对于给定的输入,结果不会改变,因此它可以缓存结果并避免调用该函数。
如果这不是您的用例,并且您需要跨会话共享变量,请使用表并查询它。如果您的表以任何频率使用,它最终将位于缓冲区缓存中,因此您可以获得所需的内存存储,而不会出现会话变量的问题