Oracle 批量收集和FORALL插入数据两次

Oracle 批量收集和FORALL插入数据两次,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,下面需要帮助 我有两个游标的代码,从第一个游标我得到不同的值,然后一个接一个地将它们传递到第二个游标(参数化),从第二个游标我得到结果集,我使用批量收集和FORALL将结果集插入表中 我有一个场景,其中对于从第一个游标获取的值,若在第二个游标中找不到中的数据,那个么将集合中的相同值插入表中两次 例如: 对于emp:1,我有两个dept2和dept3,它们将被插入到表中-完美 对于emp 2:没有部门-再次插入2和3-错误 请帮助我,若在第二个游标中找不到记录,我不想从集合中插入旧记录 我在这里发

下面需要帮助

我有两个游标的代码,从第一个游标我得到不同的值,然后一个接一个地将它们传递到第二个游标(参数化),从第二个游标我得到结果集,我使用批量收集和FORALL将结果集插入表中

我有一个场景,其中对于从第一个游标获取的值,若在第二个游标中找不到中的数据,那个么将集合中的相同值插入表中两次

例如:

对于emp:1,我有两个dept2和dept3,它们将被插入到表中-完美 对于emp 2:没有部门-再次插入2和3-错误

请帮助我,若在第二个游标中找不到记录,我不想从集合中插入旧记录

我在这里发现了一个问题,当我从批量收集stmt中删除循环和限制时,它可以正常工作,但是当我添加循环和限制时,它会插入两次数据。

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

有什么问题吗?您在ABC中获得了重复记录?这是因为不同的员工可以有相同的
dept
值。如果您最终希望在ABC中插入
emp
的所有
dept
,这样做会更容易:

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

请记住:游标是万恶之源:)

您是否尝试过使用dbms\u输出进行调试以调查问题?l\u元数据\u数组从何而来?同样在这一点上,
CREATE TABLE
INSERT
和带有变量声明的完整
DECLARE..END
块的完整示例将有助于再现。Vincent,这是atypo…它的l_数据数组不是l_元数据数组,它是嵌套表类型。我修改了代码。