1

我正在尝试使用 INSERT 语句的 SAVE EXCEPTIONS 子句处理 FORALL 异常。该过程包含两个简单的表格,如下所示;

CREATE TABLE TBL1   
  ("COL1" VARCHAR2(**40** BYTE) NOT NULL);

CREATE TABLE TBL2   
  ("COL1" VARCHAR2(**20** BYTE) NOT NULL);

这里唯一的区别是列类型的大小。任何插入超过 20 个字符的字符串值的尝试都会导致处理错误。

这是脚本;

DECLARE  
  TYPE REFCURTYPE IS REF CURSOR;
  REFCUR REFCURTYPE;  

  TYPE ASSARRTYPE IS TABLE OF TBL2%ROWTYPE
    INDEX BY PLS_INTEGER;
  ASSARR ASSARRTYPE;

  DML_ERRORS EXCEPTION;
  PRAGMA EXCEPTION_INIT(DML_ERRORS, -24381);
BEGIN
  OPEN REFCUR FOR
    SELECT
      COL1
    FROM TBL1;

  FETCH REFCUR BULK COLLECT INTO ASSARR; 
  CLOSE REFCUR;

  FORALL i IN ASSARR.FIRST..ASSARR.LAST SAVE EXCEPTIONS
    INSERT INTO TBL2 
      VALUES ASSARR(i);
  COMMIT;
  EXCEPTION
    WHEN DML_ERRORS THEN
      FOR j IN 1..SQL%BULK_EXCEPTIONS.COUNT
      LOOP
        DBMS_OUTPUT.PUT_LINE(SQLERRM(-(SQL%BULK_EXCEPTIONS(j).ERROR_CODE)));

      END LOOP;    
      COMMIT;
END;

不知何故,当为一个超过 20 多个字符的记录的数据集执行以下块时,我只收到这条错误消息;

“ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定”

提前感谢您的帮助。

4

0 回答 0