oracle中动态查询的限制

时间:2014-02-12 05:16:39

标签: oracle dynamic plsql limit

如果字符数有限,我需要一些帮助来寻找动态查询的解决方案。

我有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:未解析语句

动态查询是否接受限制?

我想到了这个问题..........

2 个答案:

答案 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。