编译Oracle包时避免挂起

时间:2015-06-25 08:53:43

标签: 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';

也是这个

select 
   x.sid 
from 
   v$session x, v$sqltext y
where 
   x.sql_address = y.address
and 
   y.sql_text like '%PROCEDURE_NAME%';

只有' body Definition Lock' 会阻止编译? 还有其他阻止编译的锁类型吗?

如何避免锁定并进行编译?仅杀死会话?还有其他什么吗?

2 个答案:

答案 0 :(得分:2)

您可能希望查看Edition-based Redefinition,它将允许您创建新版本,编译新版本而不会被当前使用该软件包的其他会话阻止,并在以后启用新版本。

答案 1 :(得分:2)

基本上,如果某人或其他人(任何其他预定作业)正在执行该程序包,那么您将无法执行重新编译。要解决这个问题,您需要确定锁定会话并将其终止。杀戮会话是我们拥有的选项,dbms_lock仅对dbms_lock创建的锁有用。你不能只是"解锁"一些对象 - 锁是有一个非常相关的原因。

您可能遇到的其他锁定是依赖锁定:请考虑 包A中的过程-1包含对包B中的过程-2的调用。 程序包A中的过程-1正在运行。 然后在编译Package-B时可能会锁定