如何检索已解析的动态pl Sql

时间:2012-03-07 19:10:54

标签: oracle plsql

我有许多执行动态sql的PL / SQL函数和过程。

是否可以提取已解析的语句和dbms_output作为调试辅助工具?

我真正想要的是查看已解析的sql(带有替换参数的sql语句)。

示例:

我有一个像这样的动态SQL语句

 SQ:='SELECT  :pComno as COMNO,null t$CPLS,t$CUNO,t$cpgs,t$stdt,t$tdat,t$qanp,t$disc,:cS Source FROM BAAN.TTDSLS031'||PCOMNO --1
    || ' WHERE' ||' TRIM(T$CUNO)=trim(:CUNO)' --2  
    ||    ' AND  TRIM(T$CPGS)=trim(:CPGS)' --3
    ||    ' AND  T$QANP      = priceWorx.fnDefaultQanp ' --4
    ||    ' AND  priceWorx.fdG2J(sysdate) between priceWorx.fdG2J(t$stdt) and priceWorx.fdG2J(t$tdat)' --5
    ||    ' AND  rownum=1 order by t$stdt';--6

    execute immediate SQ into R using 
        PCOMNO,'C' --1
        ,PCUNO-- 2
        ,PCPGS;-- 3

发送到服务器的语句是什么?

3 个答案:

答案 0 :(得分:2)

您可以显示与SQL语句关联的绑定变量,如下所示:

select v$sql.sql_text
    ,v$sql_bind_capture.*
from v$sql_bind_capture
inner join v$sql on
    v$sql_bind_capture.hash_value = v$sql.hash_value
    and v$sql_bind_capture.child_address = v$sql.child_address
--Some unique string from your query
where lower(sql_text) like lower('%priceWorx.fdG2J(sysdate)%');

您可能希望查看整个查询,并将所有绑定变量替换为其实际值。不幸的是,由于以下原因,没有简单的方法来获得您正在寻找的内容 的问题。

  1. V$SQL_BIND_CAPTURE不存储所有绑定变量信息。最大的限制是它只显示数据“当在SQL语句的WHERE或HAVING子句中使用绑定变量时。”
  2. 将绑定捕获数据中的绑定变量名称与查询匹配非常困难。很容易让它在99%的时间内正常工作,但最后1%需要SQL和PL / SQL解析器,这基本上是不可能的。
  3. SQL将从池中老化。例如,如果您在其中一个相关表上收集统计信息,则可能会使使用该表的所有查询无效。您无法始终信任V $ SQL来查询。
  4. 这意味着你可能会以丑陋的方式做到这一点。您需要手动存储SQL和绑定变量数据,类似于user1138658正在执行的操作。

答案 1 :(得分:1)

您可以使用dbms_output包执行此操作。您可以enabledisable进行调试,并使用get_line程序获取行。

我使用execute immediate进行了测试,插入表中并且可以正常工作。

我最近回答了another question,并举了一个例子。

答案 2 :(得分:0)

一种可能的解决方案是在架构中创建表temp(id varchar2,data clob);,然后将insert语句放在要查找解析密钥的位置

insert into temp values(seq.nextval,v_text);

例如

declare 
v_text varchar2(2000);
begin
v_text:='select * from emp'; -- your dynamic statement

insert into temp values(seq.nextval,v_text); --insert this script whenever you want to find the actual query 

OPEN C_CUR FOR v_text;

-----

end;

现在,如果你看到表格temp,你将获得该动态声明的数据。