为什么存储过程会永远执行,但过程中的代码会自行运行?

时间:2010-11-23 21:00:32

标签: oracle stored-procedures plsql

首先,这是Oracle。如果我这样做......

execute my_package.sp_execute_my_procedure('...', '...');

它似乎无限期地运行(我让它过夜)。

但是,如果我从存储过程中获取代码,将其打到pl / sql匿名块中,将declare关键字放在我的单个游标上并运行它,它会在10分钟内完成。这需要多长时间。

如果没有发布所有代码,至少马上就可以了,有没有人见过这样的东西?

更新:好的,所以我注意到当我从v $ session中选择时,在运​​行proc时我得到的是一个“UNKNOWN”blocking_session_status,其中包含“direct path write temp”事件。

到目前为止,我无法用谷歌搜索到目前为止这意味着什么。

3 个答案:

答案 0 :(得分:3)

在它甚至可以运行代码之前,可能存在阻塞会话的包对象的某种争用。

execute命令挂起时,请查询V$SESSION以查看该会话正在等待的内容。

答案 1 :(得分:0)

您的PL / SQL代码是否使用绑定变量,而您的DECLARE块在其中使用了文字?这可能导致不同的计划,从而产生不同的性能。

答案 2 :(得分:0)

  

但是,如果我从存储过程中获取代码,请将其打成pl / sql匿名   阻止,将declare关键字放在我的单个游标上并运行它,它以10完成   分钟。

     

...

     

它基本上有一个很大的选择,然后对于select中的每一行它做了一大堆   插入。

您是否包含插页?