ORA-04068,ORA-04065,ORA-06508 PL/SQL: could not find program unit being called

tolywang發表於2009-07-27

譯者注:Tom Kyte (Thomas Kyte)從1988年就開始使用, 在1993年加入Oracle公司,他的主要時間花費在asktom.oracle.com上。這使得asktom.oracle.com成為最受關注的Oracle問題問答網站。他幫助全球Oracle使用者解答了不計其數的問題。

以下這篇博文發表在他的個人部落格上:http://tkyte.blogspot.com/2008/06/when-others-then-null-redux.html 本部落格已經獲得Thomas Kate翻譯並轉載他的這篇博文的授權。本文的版權仍然屬於Thomas Kate。

沒有處理的when others又回來了

有些事一直在發生。

重複而又重複地,這些事一直在發生。

這是第124,215,412,523case,請你們看一下。

一位使用者對我說:

我遇到這樣的情況,從三月份的第二週開始,我在過去的五、六週裡突然開始從一個儲存過程SP_A接收到SQLException ‘Cursor is Closed’。這個情況是間歇性發生的。如果我在出現錯誤幾分鐘以後,用同樣的引數再次執行這個儲存過程,它又會返回正確的結果,而不產生錯誤。…”

當我問他“你看到的是什麼ora-xxxx錯誤?”以後,他回答的更多細節如下:

“很不幸,這種情況並不產生ORA-????錯誤。我知道在很多情況下,‘Cursor is Closed’錯誤是個程式設計錯誤,但是在這裡,情況不是這樣。 我不能如我希望的那樣重現這個錯誤。我在我們的開發環境或客戶驗收環境裡都無法重現這個錯誤。即使在生產環境,我也不能用產生錯誤的引數重現這個錯誤。

“我懷疑原因可能是Oracle的記憶體問題,因為我們剛從9i升級到10g RAC。應用程式—Java程式碼和儲存過程—到現在已經執行了56年了。甚至我們接收到的‘Cursor is Closed’錯誤也不是確定的,例如產生錯誤的引數在完全一樣的程式碼下,在幾分鐘以後就正常工作了。”

好,現在變成這樣了他們說“沒有ora-xxxx錯誤,Oracle就是把我們的遊標關掉了—沒有原因地。我們知道這不會是我們程式碼的bug,這是Oraclebug.”

故事總是這樣上演的。 就在我最後準備放棄把這個問題關閉的時候,他們又繼續了:

“我們發現SP_A有個WHEN OTHERS的例外處理子句,把真正的錯誤遮蔽了。

我們把這個錯誤去掉以後,以下是我們看到的錯誤: 

ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "SP_
A

"ORA-06508: PL/SQL: could not find program unit being called:
ORA-06512: at "SP_B", line 317
ORA-06512: at line 1

這就是過去這段時間裡間歇發生的事(之前我們並不知道因為儲存過程編寫的方式和Java程式碼與返回引數之間的互動方式,這些錯誤被表現為Cursor Closed錯誤。)”

現在他們要深入調查為什麼會發生這種問題了

記住,每個人,每個人記住,印在腦子裡: 

WHEN OTHERS後面如果沒有跟RAISERAISE APPLICATION ERROR,幾乎可以肯定(有99.999999999%的準確率),是你開發的程式碼的一個bug.一定要對when others後面沒有跟raiseraise application error這種做法說“不”。


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-610497/,如需轉載,請註明出處,否則將追究法律責任。

相關文章