declare
v_cursor number;
stmt varchar2(2000);
s varchar2(40);
cursor cc1 is select voc.SQL_ID from v$open_cursor voc left join v$sql vs on voc.SQL_ID=vs.SQL_ID where voc.SID in(select sid from v$mystat) and to_char(substr(vs.SQL_FULLTEXT,1,2000)=stmt;
begin
delete from table1;
v_cursor:=dbms_sql.open_cursor;
stmt:='inset into table2 (column1,column2) values(''a'',''b'')';
dbms_sql.parse(v_cursor,stmt,dbms_sql.native);
insert into table1 select * from tables(dbms_xplan.display
open cc1;
loop
fetch cc1 into s;
exit;
end loop;
close cc1;
insert into table1 select * from(dbms_xplan.display_cursor(s,0,'ALL'));
これを実行してtable1
から選択しますが、table1のレコードから次のことがわかります。
プランがカーソルキャッシュに存在しない可能性もあります(v $ sql_planを確認してください)。
しかし、stmtを変更してステートメントを更新して実行すると、table1
のレコードは正しいです。だから私は挿入ステートメントについてどこで分析を得ることができるか知りたいです。
child_number
へのdbms_xplan.display_cursor
引数もv$sql
から取得する必要があり、必ずしもゼロである必要はありません。 (その数に何が影響するかは正確にはわかりませんが、例でtable2
を削除して再作成すると、毎回新しいchild_number
が得られます)。
これがあなたの手順の修正版です(あなたが上に持っているもののいくつかのタイプミスを修正しました):
DECLARE
v_cursor NUMBER;
stmt VARCHAR2(2000);
s VARCHAR2(40);
cn NUMBER;
CURSOR cc1
IS
SELECT voc.SQL_ID, vs.child_number
FROM v$open_cursor voc
LEFT JOIN v$sql vs
ON voc.SQL_ID =vs.SQL_ID
WHERE voc.SID IN (SELECT sid FROM v$mystat)
AND TO_CHAR(SUBSTR(vs.SQL_FULLTEXT,1,2000))=stmt;
BEGIN
DELETE FROM table1;
v_cursor:=dbms_sql.open_cursor;
stmt :='insert into table2 values (''a'',''b'')';
dbms_sql.parse(v_cursor,stmt,dbms_sql.native);
OPEN cc1;
LOOP
FETCH cc1 INTO s, cn;
EXIT;
END LOOP;
CLOSE cc1;
-- To inspect the child number:
-- dbms_output.put_line(s || ' '|| cn);
INSERT INTO table1 SELECT * FROM table(dbms_xplan.display_cursor(s,cn,'ALL'));
END;
/