以下で助けが必要です!
2 つのカーソルを持つコードがあります。最初のカーソルから個別の値を取得し、1 つずつ 2 番目のカーソルから 2 番目のカーソル (パラメーター化) に渡します。BULK COLLECT と FORALL を使用してテーブルに挿入する結果セットを取得しています。
データが2番目のカーソルで見つからない場合、最初のカーソルからフェッチされた値に対して、コレクションからの同じ値がテーブルに2回挿入されるシーンがあります。
例えば:
emp の場合: 1 テーブルに挿入される 2 つの部門 2 と 3 があります。
2番目のカーソルにレコードが見つからない場合、コレクションから古いレコードを挿入したくありません。
ここで 1 つの問題が見つかりました。LOOP と LIMIT を BULK collect stmt から削除すると正常に動作しますが、LOOP と LIMIT を追加するとデータが 2 回挿入されます。
.Delete() メソッドを使用する必要がありますか? どこ ?
以下はサンプルコードです
DECLARE
CURSOR emp_cur IS
SELECT DISTINCT emp_id from employee;
CURSOR get_dept_cur(emp IN VARCHAR2) IS
SELECT DISTINCT dept from department where dpt_emp_id=emp;
TYPE nt_emp_metadata IS TABLE OF get_dept_cur%ROWTYPE;
l_data_array nt_emp_metadata ;
BEGIN
OPEN emp_cur ;
LOOP FETCH emp_cur INTO l_emp;
EXIT WHEN emp_cur %NOTFOUND;
OPEN get_dept_cur(l_emp);
LOOP FETCH get_dept_cur BULK COLLECT INTO l_data_array LIMIT 100;
FORALL i IN 1..l_data_array.COUNT
INSERT INTO ABC VALUES l_data_array(i);
EXIT WHEN get_dept_cur%NOTFOUND;
END LOOP;
COMMIT;
CLOSE get_dept_cur;
END LOOP;
CLOSE emp_cur ;
END;