2

dbms_sql.execute を使用して実行されたコードを追跡する方法はありますか?

たとえば、次のクエリを実行すると:

DECLARE
    cursor_name INTEGER;
    rows_processed INTEGER;
BEGIN
    cursor_name := dbms_sql.open_cursor;
    DBMS_SQL.PARSE(cursor_name, 'SELECT * FROM dual WHERE 2 = :x' ,DBMS_SQL.NATIVE);
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':x', 2);
    rows_processed := DBMS_SQL.EXECUTE(cursor_name);
    DBMS_SQL.CLOSE_CURSOR(cursor_name);   
EXCEPTION
WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(cursor_name);
END;

結果を見つけることができるはずです:

SELECT * FROM dual WHERE 2 = 2

v$sql/v$sql_bind_capture と dba_hist_sqltext/dba_hist_sqlbind を調べてみましたが、異なるバインド変数で同じ sql を実行すると、同じ sql_id を持つ sql が上書きされるため、信頼性がないようです。

4

1 に答える 1

3

すべてのバインド変数を取得する唯一の方法は、実行ごとにハードパースを実行することです。これを実現する簡単な方法は、次のように、実行後にカーソルをヒープからパージすることです。

-- get sqlAddr and hashVal from v$sqlarea
SYS.dbms_shared_pool.purge(SqlAddr||', '||hashVal,'c',127); -- 127 is a bitmask for heaps 0~7 to be freed

http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_shared_pool.htm#CHDCBEBB

その後、バインド変数のマッピングに v$sql_bind_capture を使用できます。

于 2013-10-19T17:33:56.280 に答える