ORA-04068,ORA-04065,ORA-06508 PL/SQL: could not find program unit being called
譯者注: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,523號case,請你們看一下。
一位使用者對我說:
“…我遇到這樣的情況,從三月份的第二週開始,我在過去的五、六週裡突然開始從一個儲存過程SP_A接收到SQLException ‘Cursor is Closed’。這個情況是間歇性發生的。如果我在出現錯誤幾分鐘以後,用同樣的引數再次執行這個儲存過程,它又會返回正確的結果,而不產生錯誤。…”
當我問他“你看到的是什麼ora-xxxx錯誤?”以後,他回答的更多細節如下:
“很不幸,這種情況並不產生ORA-????錯誤。我知道在很多情況下,‘Cursor is Closed’錯誤是個程式設計錯誤,但是在這裡,情況不是這樣。 我不能如我希望的那樣重現這個錯誤。我在我們的開發環境或客戶驗收環境裡都無法重現這個錯誤。即使在生產環境,我也不能用產生錯誤的引數重現這個錯誤。
…
“我懷疑原因可能是Oracle的記憶體問題,因為我們剛從9i升級到10g RAC。應用程式—Java程式碼和儲存過程—到現在已經執行了5,6年了。甚至我們接收到的‘Cursor is Closed’錯誤也不是確定的,例如產生錯誤的引數在完全一樣的程式碼下,在幾分鐘以後就正常工作了。”
…
好,現在變成這樣了—他們說“沒有ora-xxxx錯誤,Oracle就是把我們的遊標關掉了—沒有原因地。我們知道這不會是我們程式碼的bug,這是Oracle的bug.”
故事總是這樣上演的。 就在我最後準備放棄…把這個問題關閉的時候,他們又繼續了:
“我們發現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後面如果沒有跟RAISE或RAISE APPLICATION ERROR,幾乎可以肯定(有99.999999999%的準確率),是你開發的程式碼的一個bug.一定要對when others後面沒有跟raise或raise application error這種做法說“不”。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-610497/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Could not find the main class. Program will exitAI
- Compilation of Views and PL/SQL Program Units (242)ViewSQL
- PL/SQL Program Units and the Shared Pool (89)SQL
- Oracle 定時Job報錯ORA-04068 ORA-06508Oracle
- J2SE - Could not find the main class: xxx.xxx.Program will exitAI
- SQL error 2812: Could not find stored procedure.docSQLError
- PL/SQL 連線 Oralce 提示 Could not initialize oci.dllSQL
- ora-04068 ora-06508 已丟棄程式包 的當前狀態
- 32bit Pl/SQL developer 報can not find oci.dllSQLDeveloper
- expdp匯出、transport_tablespace遇見ORA-04063、ORA-06508: PL/SQL:SQL
- Fatal error: Uncaught PDOException: could not find driverErrorException
- Could not find *.apk!解決辦法APK
- nested exception is IncompleteElementException: Could not find parameter mapException
- Could not find a suitable set of interfaces for VIPs.UI
- vue3 Could not find a declaration file for moduleVue
- PL/SQLSQL
- Could not find jar tool executable問題解決JAR
- OGG-00446 ERROR: Could not find archived logErrorHive
- jar檔案could not find the main class解決JARAI
- 錯誤 - Could not find the index entry for RIDIndex
- VueX Vue: Could not find a declaration file for module vuex.Vue
- oracle concurrent program session and sqlOracleSessionSQL
- ogg GGS ERROR 500 Could not find archived logErrorHive
- cmake報錯CMake Error: Could not find CMAKE_ROOTError
- mysql中出現Unit mysql.service could not be found 的解決方法MySql
- SQL&PL/SQL (轉)SQL
- PL/SQL 宣告SQL
- PL/SQL cursorSQL
- PL/SQL打包SQL
- PL/SQL DEVSQLdev
- Oracle PL/SQLOracleSQL
- Why NoSQL Should Be Called "SQL with Alternative Storage Models"SQL
- 關於 artisan migrants Could not find drive 解決方法
- Helper Devise: could not find the `Warden::Proxy` instance on request environmentdev
- master bug InnoDB Error unlock row could not find a 4 mode lockASTError
- Could not find first log file name in binary log index fileIndex
- 使用PL/Scope分析PL/SQL程式碼SQL
- PLSQL Language Reference-PL/SQL概覽-PL/SQL架構SQL架構