有没有办法跟踪使用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。
答案 0 :(得分: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来映射绑定变量。