2014-03-28 35 views
0

我需要在Oracle 9i中重新编译软件包。但会议永远挂起。当我检查V$SESSION_WAIT时,知道它正在等待事件'library cache pin'。无法获得9i版本的可能解决方案。无论如何找到会议,那是执行我的包并杀死它?无法在Oracle 9i中重新编译软件包

回答

0

当然。 要查找会话中运行包含一个名称的代码:

select s.*,sa.* 
FROM v$session s 
left join v$sqlarea sa 
    on s.sql_address=sa.address AND s.sql_hash_value=sa.hash_value 
where sql_text like '%your_package_name_here%'; 

在此之后,你有PID和序列,所以你可以杀死你需要杀死了会议。 (上面的代码可能会返回不需要关闭的会话,例如,它发现自己:))

0

Oracle没有提供内置的简单路径来执行此操作。

如果您的应用程序使用DBMS_APPLICATION_INFO例程注册模块使用情况,您很幸运:您可以简单地查询MODULE和/或ACTION上的V $ SESSION过滤。另外,也许你在你使用的PL/SQL中有跟踪消息?

否则,您需要为包含软件包名称的调用开始拖网V$SQLTEXT(或显示SQL的几个视图中的另一个视图)。请记住使搜索不区分大小写。这会给你一个SQL_ID,你可以链接到V $ SESSION中的记录。

这只有在你的软件包是主要对象时才有效;也就是说,如果它是调用堆栈的顶部。这是为什么包裹锁定这么久的一个解释。但是也许你的软件包是从其他软件包中调用的:在这种情况下,你可能不会在V $ SQLTEXT中遇到任何问题。因此,您需要通过ALL_DEPENDENCIES找到调用它的程序,并为它们筛选V $ SQL_TEXT。

是的,这听起来像一个单调乏味的工作。这就是为什么在长时间运行的PL/SQL调用中包含某种形式的跟踪是一个好主意。