我们有一种情况,编译包需要永远! 如果我们使用新名称编译包,那么它可以工作!
我的理解是,编译因包裹上的锁而挂起!
这样的事情可能有助于找出问题!
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' 会阻止编译? 还有其他阻止编译的锁类型吗?
如何避免锁定并进行编译?仅杀死会话?还有其他什么吗?
答案 0 :(得分:2)
您可能希望查看Edition-based Redefinition,它将允许您创建新版本,编译新版本而不会被当前使用该软件包的其他会话阻止,并在以后启用新版本。
答案 1 :(得分:2)
基本上,如果某人或其他人(任何其他预定作业)正在执行该程序包,那么您将无法执行重新编译。要解决这个问题,您需要确定锁定会话并将其终止。杀戮会话是我们拥有的选项,dbms_lock仅对dbms_lock创建的锁有用。你不能只是"解锁"一些对象 - 锁是有一个非常相关的原因。
您可能遇到的其他锁定是依赖锁定:请考虑 包A中的过程-1包含对包B中的过程-2的调用。 程序包A中的过程-1正在运行。 然后在编译Package-B时可能会锁定