【发布时间】:2016-09-16 14:48:20
【问题描述】:
请帮助我理解这个概念。
我试图从使用以下代码的过程中编译无效包。它抛出以下错误
ORA-04021: 等待锁定对象时发生超时
for cur_rec in (select object_name, object_type
from user_objects
where object_type in ('PACKAGE', 'PROCEDURE', 'FUNCTION','PACKAGE BODY')
and status != 'VALID')
loop
begin
if cur_rec.object_type != 'PACKAGE BODY' then
execute immediate 'ALTER '||cur_rec.object_type||' usr.'||cur_rec.object_name||' COMPILE';
else
execute immediate 'ALTER PACKAGE usr.'||cur_rec.object_name||' COMPILE BODY';
dbms_output.put_line('Package recompiling finish');
end if;
end;
end loop;
我已经看到了这个网站上的所有建议。我检查了会话浏览器,但没有其他活动会话引用此包。
因此检查了 dba_dependencies 并意识到重新编译包的过程正在引用一个也在包中使用的表。但是过程中的这个表访问是在重新编译包之后进行的(换句话说,在过程和包中使用的表上触发了一个选择查询)
请帮帮我,这是错误的原因吗?你会认为改变会话。重置包而不是上面的代码会起作用还是抛出同样的错误?
【问题讨论】:
标签: oracle stored-procedures locking