ORA-00604: error occurred at recursive SQL level N 表示資料庫在執行**內部遞歸 SQL** (如查詢字典、維護系統表、觸發器) 時發生錯誤。真正原因永遠在後續的錯誤堆疊中 (如 ORA-04031, ORA-01547, ORA-00942 等)。
$DIAG_HOME/alert_.log 搜尋 ORA-600、ORA-7445 等嚴重錯誤。ALTER SESSION SET SQL_TRACE=TRUE; -- 或 10046 event
-- 重現錯誤操作
ALTER SESSION SET SQL_TRACE=FALSE;
-- 到 USER_DUMP_DEST 找最新 *.trc,用 TKPROF 格式化
關鍵字搜尋 error、ORA-,定位失敗的遞歸 SQL。| 案例 | 伴隨錯誤 | 根因 | 解決 |
|---|---|---|---|
| 1. JDBC 應用報 ORA-00604 + ORA-01000 | ORA-01000: maximum open cursors exceeded | Java 代碼未關閉 Statement/ResultSet,僅關閉 Connection;OPEN_CURSORS 參數過小 (預設 50)。 | ① 代碼修正:try-with-resources 確保關閉 Statement/ResultSet。② 增加 OPEN_CURSORS=500 重啟。③ 監控 V$OPEN_CURSORS。 |
| 2. EXP 導出報 ORA-00942 | ORA-00942: table or view does not exist | 升級後字典視圖失效 (如 LBACSYS.LBAC_EVENTS),catpatch.sql 執行不完全。 | ① STARTUP MIGRATE → @?/rdbms/admin/catpatch.sql (加大 JAVA_POOL_SIZE/SHARED_POOL_SIZE)。② 重編譯失效物件:@?/rdbms/admin/utlrp.sql。③ 若 Label Security 未安裝卻被升級,手動編譯:ALTER VIEW LBACSYS.LBAC$ALL_TABLE_POLICIES COMPILE;ALTER PACKAGE LBACSYS.LBAC_EVENTS COMPILE BODY; |
| 3. 應用報 ORA-04031 共享池不足 | ORA-04031: unable to allocate 4200 bytes of shared memory | Oracle 8.1.7.4 之前版本已知 Bug,共享池碎片化導致無法分配大塊記憶體。 | ① 增加 SHARED_POOL_SIZE 重啟。② 套用 Patch Set 8.1.7.4 或更高。③ 設定 _KGHDSIDX_COUNT=1 (隱含參數,諮詢 MOS)。 |
| 4. DROP USER 失敗 ORA-00942 | ORA-00942: table or view does not exist (SDO_GEOM_METADATA_TABLE) | 安裝 Spatial 選項後,系統觸發器嘗試刪除 MDSYS.SDO_GEOM_METADATA_TABLE 同義詞,但該表不存在或無效。 | ① 建立同義詞:CREATE SYNONYM SDO_GEOM_METADATA_TABLE FOR MDSYS.SDO_GEOM_METADATA_TABLE;。② 或移除 Spatial 選項:DROP USER MDSYS CASCADE; (確認未使用)。 |
| 5. UPDATE 觸發遞歸 SQL Level 2 失敗 | 視 Trace 而定 | 更新觸發器內部查詢字典/權限/觸發器鏈出錯。 | 啟用 SQL_TRACE 捕捉具體遞歸 SQL,針對性修復 (如權限授予、觸發器修正)。 |
| 6. 普通用戶連線失敗,SYSDBA 正常 | 視 Trace 而定 | 登入觸發器 (LOGON TRIGGER) 或 SYSTEM 觸發器報錯。 | 以 SYS 登入,停用/修復有問題的觸發器:ALTER TRIGGER ... DISABLE;。 |
7. 系統表 DEPENDENCY$ 索引 I_DEPENDENCY1 不可用 | ORA-00704 bootstrap failure + ORA-01502 index unusable | 人為 MOVE 系統表導致索引失效,資料庫無法 OPEN。 | ① 嘗試 ALTER INDEX SYS.I_DEPENDENCY1 REBUILD (需 MOUNT 狀態)。② 無備份/無歸檔時,僅能用工具 (如 AUL) 導出資料重建庫。③ 嚴禁直接 DDL 操作 SYS 表! |
| 8. Pro*C 程式間歇性 ORA-00604 | 視 Trace 而定 | 同案例 5,內部遞歸 SQL 間歇失敗 (如鎖衝突、空間不足)。 | 啟用 SQL_TRACE 定位具體錯誤;多數可由執行 @?/rdbms/admin/catalog.sql + catproc.sql 修復字典。 |
OPEN_CURSORS=1000、SHARED_POOL_SIZE 足夠大、啟用 CURSOR_SHARING=FORCE (評估後)。ANALYZE/DBMS_STATS 收集字典統計資訊。utlrp.sql 重編譯所有失效物件。SYS/SYSTEM 表空間物件。DDL_AUDIT 觸發器記錄所有結構變更。