无法在Oracle 9i中重新编译包

时间:2014-03-28 05:11:45

标签: sql oracle plsql oracle9i

我需要在oracle 9i中重新编译一个包。但会议永远悬而未决。当我签入V$SESSION_WAIT时,知道它正在等待事件'library cache pin'。无法获得9i版本的可能解决方案。无论如何找到会话,即执行我的包并杀死它?

2 个答案:

答案 0 :(得分: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和serial,所以你可以杀死你需要杀死的会话。 (上面的代码可能会返回你不需要杀死的会话,例如,它发现自己:))

答案 1 :(得分: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调用中包含某种形式的跟踪是个好主意的原因。