请帮助我理解这个概念。
我试图使用以下代码从过程中编译无效的包。它抛出以下错误
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并意识到重新编译包的过程引用了一个也在包中使用的表。但是在重新编译包之后程序中的这个表访问(换句话说,在一个表上触发的select查询也在过程和包中使用)
请帮帮我们,这是错误的原因吗?你认为改变会议。重置包而不是上面的代码会工作或抛出相同的错误?
答案 0 :(得分:1)
如果这是在一个过程中运行,不会尝试重新编译自己并因为它当前正在运行而死锁?
如果您有一个程序试图删除自己,则会发生同样的死锁:
CREATE OR REPLACE PROCEDURE calc_bonus (emp_id NUMBER) AS
BEGIN
EXECUTE IMMEDIATE 'DROP PROCEDURE calc_bonus'; -- deadlock!
END;
/