9

カーソルによって返されたすべてのレコードに対していくつかの計算を実行するプロシージャがあります。次のようになります。

PROCEDURE do_calc(id table.id_column%TYPE)
IS
  CURSOR c IS
    SELECT col1, col2, col3
      FROM table
     WHERE ...;
BEGIN
  FOR r IN c LOOP
    -- do some complicated calculations using r.col1, r.col2, r.col3 etc.
  END LOOP;
END;

ここで、別のテーブルから取得した別のレコード セットに対してまったく同じ計算を実行する必要がある場合があります。ただし、これらは上記の例と同じ「形状」を持っています。

次のような手順を書くことは可能ですか?

PROCEDURE do_calc2(c some_cursor_type)
IS
BEGIN
  FOR r IN c LOOP
    -- do the calc, knowing we have r.col1, r.col2, r.col3, etc.
  END LOOP;
END;

については知ってSYS_REFCURSORいますが、もっと便利なFOR ... LOOP構文と暗黙的なレコード型を使用できるかどうか疑問に思っていました。

4

4 に答える 4

12

パッケージを作成します。

カーソルをパッケージ変数として宣言します。

%rowtype関数パラメーターの型を設定するために使用します。

create or replace package test is
  cursor c is select 1 as one, 2 as two from dual;

  procedure test1;
  function test2(test_record c%ROWTYPE) return number;

end test;


create or replace package body test is
  procedure test1 is    
  begin
    for r in c loop      
      dbms_output.put_line(test2(r));
    end loop;
  end;

  function test2(test_record c%ROWTYPE) return number is
    l_summ number;
  begin
    l_summ := test_record.one + test_record.two;
    return l_summ;
  end;
end test;
于 2012-05-18T06:39:30.867 に答える
-1

はい、カーソルを変数としてパッケージに宣言する必要があるため、カーソルをプロシージャと関数に明示的に使用できます

于 2015-05-07T08:30:59.730 に答える