1

私はストアド プロシージャ Procedure1 を持っています。

  1. Procedure1 内で、sys_refcursor ProcResult2 を返す別のプロシージャー Procedure2 を呼び出しています。
  2. このカーソルの各行をトラバースし、データをテーブルに挿入する必要があります

コード

Create Procedure1()  
as   
ProcResult1 Sys_refcursor;  
begin  
    Procedure2(ProcResult2);  
    For eachrow in ProcResult2  
      Loop  
        insert into test_table(ProcResult2.Id);  
      end loop;  
end ;\  

2.機能を実現する方法についてのアイデア、指針はありますか?つまり、ProcResult2 で返された各行をトラバースし、新しいテーブルに挿入します。

4

1 に答える 1

2

あなたはもうすぐそこにいます:

Create Procedure1()  
as   
    ProcResult1 Sys_refcursor;  
    v_record ???; -- See below
begin  
    Procedure2(ProcResult2);  
    Loop  
        fetch ProcResult2 into v_record;
        exit when ProcResult2%notfound;
        insert into test_table(v_record.Id);  
    end loop;  
    close ProcResult2;
end;

カーソルが返すものと一致する構造を持つ変数 v_record を宣言する必要があります。つまり、プロシージャを構築するときにカーソル レコードの構造を知る必要があります。カーソルが「select * from mytab」を返す場合は、次を使用できます。

v_record mytab%rowtype;

ただし、「mytab から col1、col3 を選択」などの特定の列のみを選択する場合は、構造を手動で定義する必要があります。

type v_record_type is record (col1 number, col3 varchar2(10));
v_record v_record_type;
于 2012-05-04T10:04:43.580 に答える