9

結果セットとしてsys_refcursorを返す以下の基本レイアウトのストアドプロシージャがあります。(技術的には4つになりますが、わかりやすくするために1つだけ言います)。結果セットは、一時テーブルからの選択です。

procedure aProcedure
( C1 in out sys_refcursor
) is
begin
--populate Temp_Table here with a stored proc call;
OPEN C1 FOR
SELECT Cols
FROM TEMP_TABLE;

別のストアドプロシージャを使用して、この結果セットをC1から永続テーブルに挿入する必要があります。これは実行可能ですか、それとも結果セットを再構築する必要がありますか?

オラクルの外部でカーソルと結果セットを操作するための情報を見つけることができましたが、それ自体の中でそれらを操作するための情報は見つかりませんでした。

最初にストアドプロシージャから挿入するのは理にかなっているかもしれませんが、それは実際にはそうする必要はありません。結果セットを永続的に保存することはオプションの要件です。

役立つ情報をありがとう。

4

1 に答える 1

18

呼び出し元が開いているカーソルの構造を知っていると仮定すると、次のaProcedureようなことができます。

declare
  l_rc sys_refcursor;
  l_rec temp_table%rowtype;
begin
  aProcedure( l_rc );
  loop
    fetch l_rc
     into l_rec;
    exit when l_rc%notfound;

    dbms_output.put_line( l_rec.col1 );
  end loop;
  close l_rc;
end;
/

レコードタイプにフェッチできない場合は、他のいくつかのスカラーローカル変数にフェッチすることもできます(数とタイプはaProcedure、リストで指定されている列の数とタイプと一致する必要がありますSELECT)。私の場合、aProcedure2つの数値列を返すように定義しました

declare
  l_rc sys_refcursor;
  l_col1 number;
  l_col2 number;
begin
  aProcedure( l_rc );
  loop
    fetch l_rc
     into l_col1, l_col2;
    exit when l_rc%notfound;
    dbms_output.put_line( l_col1 );
  end loop;
  close l_rc;
end;
于 2012-04-05T23:04:09.527 に答える