首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检索已解析的dynamic pl Sql

如何检索已解析的dynamic pl Sql
EN

Stack Overflow用户
提问于 2012-03-08 03:10:54
回答 3查看 1K关注 0票数 0

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

可以提取解析后的语句和dbms_output作为调试辅助吗?

我真正想要的是看到解析后的sql (带有替代参数的sql语句)。

示例:

我有一个动态SQL语句,如下所示

代码语言:javascript
复制
 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

将向服务器发送什么语句?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-08 13:32:33

您可以按如下方式显示与SQL语句关联的绑定变量:

代码语言:javascript
复制
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 statement."
  2. Matching的WHERE或HAVING子句时,从绑定捕获数据到查询的绑定变量名是极其困难的。让它在99%的时间内工作是很容易的,但最后1%需要一个SQL和PL/SQL解析器,这基本上是impossible.
  3. SQL将老化的池。例如,如果您收集其中一个相关表的统计信息,则可能会使使用该表的所有查询无效。您不能总是信任V$SQL来执行您的查询。

这意味着你可能被困在了丑陋的方式中。您需要手动存储SQL和绑定变量数据,类似于user1138658正在做的事情。

票数 2
EN

Stack Overflow用户

发布于 2012-03-08 04:29:19

您可以使用dbms_output包来做到这一点。您可以使用enabledisable调试程序,并使用get_line过程获得代码行。

我用execute immediate进行了测试,插入到一个表中,它可以工作。

我最近用一个使用它的例子回答了another question

票数 1
EN

Stack Overflow用户

发布于 2012-03-08 03:47:59

一种可能的解决方案是在您的模式中创建一个表temp(id varchar2,data clob);,然后将insert语句放在您希望找到已解析的键的任何位置

代码语言:javascript
复制
insert into temp values(seq.nextval,v_text);

例如

代码语言:javascript
复制
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,您将获得该动态语句的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9607571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档