2012-03-16 12 views
2

私はPL/SQLが初めてで、一括挿入を作成しています。私は入れ子にされたカーソルを持っていて、内側のカーソルの中にレコードをコレクションに追加して、一括挿入を実行します。私は、コレクションを作成します。カーソル内のテーブルへの追加

TYPE mydata_tab IS TABLE OF mydata%ROWTYPE INDEX BY BINARY_INTEGER; 
v_mydata_tab mydata_tab; 

そして、私のカーソルは次のようになります。

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    -- here is where I want to add a record to v_mydata_tab, that uses properties of both rec_one and rec_two 

    -- something like SELECT rec_one.key, rec_one.a, rec_two.b INTO v_mydata_tab; 

    END LOOP; 
END LOOP; 

私はSELECT INTOINSERT INTOでいじってきましたが、これを取得する方法を見つけ出すように見えることはできません作業。あなたが1つの選択ステートメントに2つのカーソルのSQLを組み合わせることができれば、あなたの代わりにこれを行うことができ、もちろん

n := 0; -- n is integer variable declared above 

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    n := n + 1; 
    v_mydata(n).key := rec_one.key; 
    v_mydata(n).a := rec_two.a; 
    v_mydata(n).b := rec_two.b; 

    END LOOP; 
END LOOP; 

答えて

1

あなたはこのようにそれを行うことができます

select x.key, y.a, y.b 
bulk collect into v_mydata 
from ...; 

かあまりにも多くのデータ:

open cur; 
loop 
    fetch cur bulk collect into v_mydata limit 1000; 
    ... 
    exit when cur%notfound; 
end loop; 
close cur; 
+0

ありがとうございます!私は実際のデータのためにSQLを組み合わせるオプションがありませんが、最初の例は私が必要としていたものです。 – Paul

1

あなたはちょうど割り当てを使用します。 rec_oneおよびrec_twoはレコードタイプのローカル変数です。

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    i := v_mydata_tab.COUNT+1; -- declare i above as local var 

    v_mydata_tab(i).key := rec_one.key; 
    v_mydata_tab(i).a := rec_one.a; 
    v_mydata_tab(i).b := rec_two.b; 

    END LOOP; 
END LOOP; 
+0

私はCOUNTを使うのが好きです。コードを読みやすくします。 – Paul

関連する問題