1

私のストアド プロシージャには、次のようなコード スニペットがあります。

OPEN p_result FOR
SELECT *
FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));
COMMIT;

p_resultタイプのIN OUTパラメータですSYS_REFCURSORRpt_mapping_TableTypeユーザー定義のコレクション型です。したがって、このカーソルは Rpt_mapping_TableType を設定するだけで、このプロシージャを呼び出すプログラムは Rpt_mapping_TableType から結果を読み取ります。私の質問はCOMMIT、このスニペットでの使用は何ですか? コードの作成者は、カーソルを閉じる方法だと言います。そうですか?私のもう 1 つの質問は、コレクションにデータを入力したいだけなのか、それを行う必要があるのか​​ということですOPEN p_result FOR。結局、私はカーソルから何も読んでいないので:

SELECT *  FROM TABLE (CAST ( l_data AS Rpt_mapping_TableType));

十分なはずです。

いいえ?

4

1 に答える 1

1

コミットはカーソルを閉じません。もしそうなら、あなたのコードは機能しません。(ただし、 から行をロック解除する可能性がありFOR UPDATE、他の問題を引き起こす可能性があります。) カーソルを閉じないコミットの例を次に示します。

SQL> variable test refcursor
SQL> begin
  2  open :test for select 1 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> print test;

         1
----------
         1

SQL>

コレクションにデータを入力したいだけなら、SELECT ... BULK COLLECT INTO ...代わりに次のようなものを使用したほうがよいでしょう。(そしておそらく a を使用しLIMITます。) キーワードCURSORは頻繁に過剰に使用されます。別のプログラムにデータを渡す場合を除き、通常、暗黙カーソルと一括収集の方がはるかに簡単で高速です。

于 2012-08-22T18:01:27.203 に答える