【问题标题】:Limit for Dynamic query in oracleoracle中动态查询的限制
【发布时间】:2014-02-13 06:08:13
【问题描述】:

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

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

动态查询接受有限制吗?

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

【问题讨论】:

  • 变量的内容是什么? (粗略地说,发布 4000 个字符的查询是不明智的。)
  • 他们有查询、选择、列、连接所有这些
  • 您的查询包含超过 4200 个字符,这有点令人担忧。我有一些非常重要的查询,但我怀疑我曾经破坏过几百个字符。更不用说您使用的是动态 SQL。也许有办法简化它?也许这实际上应该是多个独立的查询?
  • 总共有 4200 个字符。场景是它有选择列、内部选择查询、连接和过滤器......它包含的所有东西......没有什么可以最小化
  • 是的,但总的来说,它们是要传递给CURSOR 的单个查询。听起来非常容易出错。这可以是任何东西。

标签: oracle dynamic plsql limit


【解决方案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;

【讨论】:

    【解决方案2】:

    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 意味着动态语句没有被解析,它有一个(或多个)错误。像这样组装动态查询时的一个常见错误是忘记关键字之间的空格。

    考虑一下:

    v1 := 'select * from';
    t := 'EMP'
    
    open refc for v1||t;
    

    问题是,连接语句是select * fromEMP。无效的 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多