0

以下で助けが必要です!

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;
4

1 に答える 1

2

どうしたの?ABC で重複したレコードを取得していますか? deptこれは、異なる従業員に対して同じ価値を持つことができるためです。最終的に ABC にすべてを挿入したい場合はdept、次のempsようにする方が簡単です。

INSERT INTO ABC
SELECT d.dept
FROM employee e
JOIN department d
ON e.dept=d.dept
GROUP BY d.dept;

覚えておいてください:カーソルはすべての悪の根源です:)

于 2013-10-13T07:37:05.193 に答える