编译 Oracle 包时避免挂起

Dat*_*ase 7 sql oracle plsql oracle11g

我们遇到的情况是,包的编译需要永远进行!如果我们用新名称编译包,那么它就可以工作了!

据我了解,编译由于包上的锁而挂起!

像这样的事情可能有助于识别问题!

    SELECT s.sid,
       l.lock_type,
       l.mode_held,
       l.mode_requested,
       l.lock_id1,
    FROM   dba_lock_internal l,
       v$session s
    WHERE s.sid = l.session_id
    AND UPPER(l.lock_id1) LIKE '%PROCEDURE_NAME%'
    AND l.lock_type = 'Body Definition Lock';
Run Code Online (Sandbox Code Playgroud)

还有这个

select 
   x.sid 
from 
   v$session x, v$sqltext y
where 
   x.sql_address = y.address
and 
   y.sql_text like '%PROCEDURE_NAME%';
Run Code Online (Sandbox Code Playgroud)

难道只有“body Definition Lock”阻止编译吗?还有其他锁类型会阻止编译吗?

如何避免锁并进行编译?仅通过终止会话?还有别的事吗?

HAL*_*000 3

您可能想要研究基于版本的重定义,它可以让您创建新修订版、编译新版本而不会被当前使用包的其他会话阻止,并在以后启用新修订版。