Exception 大容量收集和forall,并保存异常

Exception 大容量收集和forall,并保存异常,exception,oracle11g,save,forall,bulk-collect,Exception,Oracle11g,Save,Forall,Bulk Collect,我有下面的代码,emp1表有12行数据,其中2个empno已经存在于emp表中。我正试图保存这两条记录的异常,并将剩余的全部插入emp。但一切都出错了,我无法插入emp。任何人都请帮忙 SET SERVEROUTPUT ON; DECLARE CURSOR C1 IS SELECT EMPNO FROM EMP1; TYPE T IS TABLE OF C1%ROWTYPE; L_DATA T; L_ERRORS_COUNT NUMBER; EX_DML_ERRO

我有下面的代码,emp1表有12行数据,其中2个empno已经存在于emp表中。我正试图保存这两条记录的异常,并将剩余的全部插入emp。但一切都出错了,我无法插入emp。任何人都请帮忙

SET SERVEROUTPUT ON;
DECLARE
  CURSOR C1
  IS
    SELECT EMPNO FROM EMP1;
TYPE T
IS
  TABLE OF C1%ROWTYPE;
  L_DATA T;
  L_ERRORS_COUNT NUMBER;
  EX_DML_ERRORS  EXCEPTION;
  PRAGMA EXCEPTION_INIT (ex_DML_ERRORS, -47);
  L_ERRNO NUMBER;
  L_MSG   VARCHAR2(4000);
  L_IDX   NUMBER;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 BULK COLLECT INTO L_DATA;
    BEGIN
      FORALL I IN 1..L_DATA.COUNT SAVE EXCEPTIONS
      INSERT
      INTO EMP
        (
          EMPNO,
          ENAME,
          MGR
        )
        VALUES
        (
          L_DATA(I).EMPNO,
          'SCOTT',
          L_DATA(I).EMPNO
        );
    EXCEPTION
    WHEN dup_val_on_index THEN
      DBMS_OUTPUT.PUT_LINE('WHD');
      L_ERRORS_COUNT := SQL%BULK_EXCEPTIONS.COUNT;
      DBMS_OUTPUT.PUT_LINE('WHD::::'||L_ERRORS_COUNT);
      FOR J IN 1..L_ERRORS_COUNT
      LOOP
        L_ERRNO := SQL%BULK_EXCEPTIONS
        (
          J
        )
        .ERROR_CODE;
        L_MSG := SQLERRM(-L_ERRNO);
        L_IDX := SQL%BULK_EXCEPTIONS(J).ERROR_INDEX;
        DBMS_OUTPUT.PUT_LINE('I am here SVS:'||L_ERRNO||':'|| L_MSG||':'||L_IDX);
        --INSERT INTO EMPS_EXC1(SQLC ,SQLE ,INDX ) VALUES(L_ERRNO, L_MSG,L_IDX);
        DBMS_OUTPUT.PUT_LINE('I am here SVS:'||L_ERRNO||':'|| L_MSG||':'||L_IDX);
      END LOOP;
    END;
    EXIT
  WHEN C1%NOTFOUND;
  END LOOP;
  CLOSE C1;
END;

欢迎来到SO。您最好用您使用的数据库来标记您的问题。Oracle Database 11g Enterprise Edition 11.2.0.1.0 PL/SQL 11.2.0.1.0版