執行 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'));
SET SERVEROUTPUT OFF。DBMS_OUTPUT 與執行計畫,可先關閉 SERVEROUTPUT 取得計畫,再開啟重跑收集輸出。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 影響,可作為替代方案快速查看計畫。