我正在尝试使用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:数字或值错误:批量绑定:截断绑定”
提前感谢您的帮助。