2013-10-16 34 views
1

有沒有一種方法可以跟蹤使用dbms_sql.execute執行了哪些代碼?驗證dbms_sql.execute執行代碼PL/SQL

例如,如果我運行此查詢:

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被覆蓋。

回答

2

捕獲所有綁定變量的唯一方法是在每次執行時執行硬解析。 最簡單的方式實現這一目標是在它已經如下執行從堆清除光標:

-- 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映射綁定變量。

+0

太棒了,這似乎工作。謝謝。 –