BULK收集和FORALL两次插入数据

时间:2013-10-09 14:16:48

标签: oracle plsql oracle11g

在下面需要帮助!

我有2个游标的代码,从第一个游标我得到不同的值,并逐个将它们从第二个游标传递到第二个游标(参数化)我得到的结果集我使用BULK COLLECT插入到表中FORALL。

我有一个scenerio,其中从第一个光标获取的值,如果在第二个光标中找不到数据,那么来自集合的相同值将被插入到表中两次。

例如:

对于emp:1我有两个部门2和3正在插入表格 - 完美 对于emp 2:没有dept - 2再次插入3 - 错误。

请帮助我,如果在第二个光标中找不到记录,我不想从集合中插入旧记录。

我在这里发现了一个问题,当我从BULK收集stmt中移除LOOP和LIMIT时它工作正常但是当我添加LOOP和LIMIT时它会插入两次数据。

我应该使用.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;

1 个答案:

答案 0 :(得分:1)

有什么问题?您在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;

记住:游标是所有邪恶的根源:)