如何识别锁定的PL/SQL包(Oracle 10.0.4.2)?

如何识别锁定的PL/SQL包(Oracle 10.0.4.2)?,oracle,session,plsql,locking,Oracle,Session,Plsql,Locking,我试图重新编译PL/SQL包,但没有成功。因为有东西拿到了锁,但很长一段时间没有打开。一旦我杀死了所有会话,我就能够重新编译,但遇到了相同的行为(即,锁定的包),我想知道有什么工具可以用来识别什么可以获得它,并且永远不会释放它?这种情况发生在(Oracle 10.2.0.4)上。非常感谢你的帮助 我想你指的是10.2.0.4,因为没有10.0.x.x版本系列 select * from v$locked_object lo join dba_objects o on lo.object_id =

我试图重新编译PL/SQL包,但没有成功。因为有东西拿到了锁,但很长一段时间没有打开。一旦我杀死了所有会话,我就能够重新编译,但遇到了相同的行为(即,锁定的包),我想知道有什么工具可以用来识别什么可以获得它,并且永远不会释放它?这种情况发生在(Oracle 10.2.0.4)上。非常感谢你的帮助

我想你指的是10.2.0.4,因为没有10.0.x.x版本系列

select * from v$locked_object lo join dba_objects o on lo.object_id = o.object_id
where o.object_name = 'xxPACKAGE NAMExx' and o.object_type = 'PACKAGE';

哪个会话锁定了PL/SQL包?dba-oracle.com上的答案并不完整。会话当前可能没有执行直接引用包的SQL(例如,它可能是通过同义词等)。进一步说@GaryMyers,该脚本也不能正确处理大写/小写或一个包调用另一个包。可能使用
select*from DBA_DDL_LOCKS,其中的名称类似于“%package_name%”
表示RAC。对于单实例数据库,从gv$中删除g。虽然此代码片段可以解决问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
select l.session_id, l.owner, l.name, l.type, inst_id, sql_id
     , a.sql_fulltext
     , 'alter system disconnect session '''||s.sid||','||s.serial#||',@'||inst_id||''' immediate' ddl
  from dba_ddl_locks l 
  join gv$session s on s.sid = l.session_id
  join gv$sqlarea a using(inst_id, sql_id)
 where l.name = 'OBJECT_NAME'  
;