我有许多执行动态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
发送到服务器的语句是什么?
答案 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)%');
您可能希望查看整个查询,并将所有绑定变量替换为其实际值。不幸的是,由于以下原因,没有简单的方法来获得您正在寻找的内容 的问题。
这意味着你可能会以丑陋的方式做到这一点。您需要手动存储SQL和绑定变量数据,类似于user1138658正在执行的操作。
答案 1 :(得分:1)
您可以使用dbms_output
包执行此操作。您可以enable
和disable
进行调试,并使用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,你将获得该动态声明的数据。