0

我有一个正在执行动态选择查询的存储过程。查询字符串很大。下面是存储过程

创建或替换
程序 My_SP
(
procRefCursor out sys_refcursor,
--我这里的其他输入变量
)
是

dynSqlComplete varchar2(8000) := 'n/a';

开始

  dynSqlComplete := '这里的大查询';

  为 dynSqlComplete 打开 procRefCursor;

结尾;

当我运行这个 sp 它显示以下错误

ORA-00600: 内部错误代码, 参数: [qcscbAddToSelLists], [], [], [], [], [], [], [], [], [], [], []

所以我将变量的大小减小dynSqlComplete到 varchar2(5000),然后运行存储过程。我收到以下错误:

ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小

我徒劳地尝试了很多东西,我也不想在这里添加它们,因为它会误导。

-- 编辑 -- 2012 年 6 月 6 日

大家好,

我能够查明问题,但我还不能解决它。我尝试逐部分运行查询,但发现引发错误的查询。它包含START WITH,当我评论它时,查询开始起作用。我已经给出了下面的代码并注释掉了给出错误的代码。

      选择 RowNum 作为 RowNumber1,
      GR.*,
      --LEVEL AS LineageLvl,
      VDE.*
    从
      (选择 *
      FROM group_relations left external join relation_classifier_instances RC on
      rc.relation_id = group_relations.Group_relation_id WHERE group_relation_type_id IN
      (19,20,32,38,42,43) 和 (rc.relation_id 为空)
      ) GR
    左外连接 Vendor_Feed_data_elements VDE
    ON GR.Group_Relation_Type_Id = 19
    AND GR.Primary_GroupField_Id = VDE.Vendor_Data_Element_Id
      /* 给出错误的代码
      从...开始
      (
        VDE.Vendor_Data_Element_Id 不为空)
      CONNECT BY nocycle 先于 GR.RELATED_GROUPFIELD_ID = GR.PRIMARY_GROUPFIELD_ID*/

4

2 回答 2

0

您可以尝试在 11g 中使用 clob 和 CLOB,类似于(未经测试):

declare
  l_sql clob;
  l_str1 varchar2(32767);
  l_str2 varchar2(32767);
begin
  dbms_lob.createtemporary(l_sql, false);

  l_str1 := 'some large SQL chunk';
  l_str2 := 'and the rest of large SQL chunk';

  l_sql := l_str1;
  dbms_lob.writeappend(l_sql, length(l_str2), l_str2);

  execute immediate l_sql;

  dbms_lob.freetemporary(l_sql);

end;
于 2012-05-29T16:52:41.430 回答
-1

确定不想要函数?这是我制作的类似内容的示例。

FUNCTION showbody(cust varchar2, receipt varchar2) 
    RETURN sys_refcursor AS retval sys_refcursor;
BEGIN
    OPEN retval FOR
        SELECT * 
        FROM comp.comp_remittance_details
        WHERE receipt_number=receipt 
            AND customer_number=cust;
    RETURN(retval);
END showbody;
于 2012-05-29T16:34:10.027 回答