验证dbms_sql.execute执行的代码PL / SQL

时间:2013-10-16 10:17:23

标签: sql plsql database bind-variables

有没有办法跟踪使用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。

1 个答案:

答案 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来映射绑定变量。