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て、コメントすると、クエリが機能し始めました。以下のコードを提供し、エラーが発生しているコードをコメントアウトしました。

      RowNumber1 として RowNum を選択し、
      GR.*、
      --LEVEL AS LineageLvl,
      VDE.*
    から
      (選択する *
      FROM group_relations left 外部結合 relationship_classifier_instances RC オン
      rc.relation_id = group_relations.Group_relation_id WHERE group_relation_type_id IN
      (19,20,32,38,42,43) および (rc.relation_id は null)
      ) GR
    LEFT OUTER JOIN Vendor_Feed_data_elements VDE
    オン GR.Group_Relation_Type_Id = 19
    AND GR.Primary_GroupField_Id = VDE.Vendor_Data_Element_Id
      /* エラーが発生しているコード
      皮切りに
      (
        VDE.Vendor_Data_Element_Id は NULL ではありません)
      CONNECT BY nocycle before 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 に答える