首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

解決 SQL*Plus 中「cannot fetch plan for SQL_ID」錯誤:關閉 SERVEROUTPUT 即可

     編輯:Oracle 教學

解決 SQL*Plus 中「cannot fetch plan for SQL_ID」錯誤:關閉 SERVEROUTPUT 即可

錯誤現象

執行 DBMS_XPLAN.DISPLAY_CURSOR 顯示執行計畫時,出現:

NOTE: cannot fetch plan for SQL_ID: 9babjv8yq8ru3, CHILD_NUMBER: 0
Please verify value of SQL_ID and CHILD_NUMBER;
It could also be that the plan is no longer in cursor cache (check v$sql_plan)

根本原因

SQL*Plus 開啟 SET SERVEROUTPUT ON 時,每次執行完使用者 SQL 後,會自動呼叫 DBMS_OUTPUT.GET_LINES 取回緩衝區輸出。此時 V$SQL 中最近一條 SQL 變成這個內部呼叫,而非使用者的查詢,導致 DISPLAY_CURSOR 找不到目標 SQL_ID。

解決方法

SET SERVEROUTPUT OFF
-- 再次執行查詢
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));

最佳實務

  1. 撰寫效能測試腳本時,習慣在開頭加上 SET SERVEROUTPUT OFF。
  2. 若需同時觀察 DBMS_OUTPUT 與執行計畫,可先關閉 SERVEROUTPUT 取得計畫,再開啟重跑收集輸出。
  3. 使用 SQL_ID 明確指定:DBMS_XPLAN.DISPLAY_CURSOR('sql_id', 0, 'ALLSTATS LAST')。

延伸知識

  • DBMS_XPLAN.DISPLAY_CURSOR 預設顯示當前 Session 最後一條游標的計畫;若游標已老化出 Shared Pool,則需從 AWR/DBA_HIST_SQL_PLAN 取得。
  • SET AUTOTRACE ON 不受 SERVEROUTPUT 影響,可作為替代方案快速查看計畫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved