在oracle中重新编译时对象何时被锁定

时间:2016-09-16 14:48:20

标签: oracle stored-procedures locking

请帮助我理解这个概念。

我试图使用以下代码从过程中编译无效的包。它抛出以下错误

  

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查询也在过程和包中使用)

请帮帮我们,这是错误的原因吗?你认为改变会议。重置包而不是上面的代码会工作或抛出相同的错误?

1 个答案:

答案 0 :(得分:1)

如果这是在一个过程中运行,不会尝试重新编译自己并因为它当前正在运行而死锁?

如果您有一个程序试图删除自己,则会发生同样的死锁:

CREATE OR REPLACE PROCEDURE calc_bonus (emp_id NUMBER) AS
BEGIN
   EXECUTE IMMEDIATE 'DROP PROCEDURE calc_bonus'; -- deadlock!
END;
/