1

2つのカーソルを返すパッケージに取り組んでいます。1つのカーソルは、数値の主キーを持つ項目のリストです。もう1つのカーソルは、アイテムに関連付けられているファイルのリストです。

これまでのコード:

procedure get_items_with_files(
           o_results out sys_refcursor,
           o_files out sys_refcursor
) is 
begin

   begin
      open o_results for
          select item_id,
                 item_name
          from items;
   end;

   begin
      open o_files for
           select item_id
                  item_file_name
           from item_files if
           where if.item_id in (select item_id from TABLE(CAST(o_results)));
   end;
end get_items_with_files;

私が問題に直面している領域:

  1. table(cast(cursor))セクションでキーワードが見つからないというエラーが発生する
  2. コード内のカーソルにそのままアクセスできますか、それとも内部変数にコピーする必要がありますか?sys_refcursorタイプの変数と「setv_cursor:= o_results」を作成しようとしましたが、オプションが見つからないか無効なエラーが発生しました。
4

1 に答える 1

0

O_RESULTSカーソルを使用してカーソルを開くことはできませんO_FILES

両方のカーソルを開くためにテーブルを照会できますが、カーソルを開いてからカーソルを開くまでの間に一部のデータが変更され、2つの結果セットが同期してITEMSいない可能性があります。O_RESULTSO_FILES

procedure get_items_with_files(
           o_results out sys_refcursor,
           o_files out sys_refcursor
) is 
begin

   begin
      open o_results for
          select item_id,
                 item_name
          from items;
   end;

   begin
      open o_files for
           select item_id
                  item_file_name
           from item_files if
           where if.item_id in (select item_id from items);
   end;
end get_items_with_files;

2つのテーブルを結合した結果を表す単一のカーソルを返す方がはるかに一般的です。

procedure get_items_with_files(
           o_results out sys_refcursor
) is 
begin
  open o_results for
      select item_id,
             item_name,
             item_file_name
        from items
             join item_files using (item_id);
end get_items_with_files;

ただし、プロシージャがカーソルを開くだけの場合は、プロシージャを作成するよりもビューを作成してから、プロシージャを呼び出すよりもビューをクエリする方が一般的です。

于 2012-03-01T20:37:24.200 に答える