如果字符数有限,我需要一些帮助来寻找动态查询的解决方案。
我有7个变量,每个变量都定义为varchar2(4000)。
我检查了每个变量的长度,所有这些变量总共为4217。
我尝试使用以下语法执行动态查询。
OPEN p_Cursor FOR v_Query || v_I || vW1 || v_W2 || v_O || v_ODir || v_Join
USING value1, value2, value3;
我收到错误,并认为显示查询并且无法显示。 当我删除最后2个变量时,它会显示查询。
错误: 执行失败:ORA-00604:递归SQL级别1发生错误 ORA-01003:未解析语句
动态查询是否接受限制?
我想到了这个问题..........
答案 0 :(得分:1)
我发现将命令放入变量并在执行之前输出它是有用的。这允许您查看实际执行的内容:
DECLARE
l_cmd VARCHAR2 (2000);
BEGIN
l_cmd := v_query || v_i || vw1 || v_w2 || v_o || v_odir || v_join;
DBMS_OUTPUT.put_line (l_cmd);
END;
答案 1 :(得分:0)
PL / SQL始终支持32767个字符的字符串including in dynamic SQL。在11g被提升到CLOB。 Find out more。因此,如果您对语句总长度的计算是正确的,那么您的语句的简单长度似乎不应该受到指责。
您说“显示查询但无法显示”,但您没有说明您获得的错误和错误。我们假设DBMS_OUTPUT。删除最后两个变量允许显示语句,因此看起来语句的大小可能是个问题。同样,PUT_LINE()的缓冲区是32767.即使问题是缓冲区溢出,因为你没有指定SET SERVEROUTPUT ON SIZE << big number>>
,默认值是20000,这大于4217.所以我之前的警告关于长度该声明适用于此处。
无论如何,ORA-01003意味着动态语句没有被解析,它有一个bug(或bug)。组合这样的动态查询时常见的错误是忘记关键词之间的空格。
考虑一下:
v1 := 'select * from';
t := 'EMP'
open refc for v1||t;
问题是,连接语句是select * fromEMP
。无效的SQL。