Oracle:所有保存异常均不起作用
我正在尝试使用INSERT语句的SAVE exceptions子句处理FORALL异常。该流程包含两个简单的表格,如下所示:Oracle:所有保存异常均不起作用,oracle,plsql,bulk,forall,Oracle,Plsql,Bulk,Forall,我正在尝试使用INSERT语句的SAVE exceptions子句处理FORALL异常。该流程包含两个简单的表格,如下所示: CREATE TABLE TBL1 ("COL1" VARCHAR2(**40** BYTE) NOT NULL); CREATE TABLE TBL2 ("COL1" VARCHAR2(**20** BYTE) NOT NULL); 这里唯一的区别是列类型的大小。任何试图插入超过20个字符的字符串值的尝试都会导致处理错误 这是剧本 DECLARE
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:数字或值错误:大容量绑定:截断绑定”
提前感谢您的帮助。要问一个明显的问题,tbl1.col1是否定义为与tbl2中的列不同的数据类型,从而导致缓冲区溢出?如果是这样的话,它是在大容量收集上爆炸的,而不是FORALLHi-Michael,当两个表都有40字节/字符时,一切都正常工作,这可能表明大容量是正确的。我所做的与Oracle站点中的“FORALL语句完成后处理所有异常的示例12-13”大致相同:是的,您要获取的内容必须首先放入集合容器中。如果您将类型ASSARRTYPE IS TABLE of TBL2%ROWTYPE的定义更改为TBL1%ROWTYPE,因为您是从TBL1获取的,那么大容量收集将工作,而错误将发生在Forall insert上-在您想要的位置,Michael,您是对的,这就是问题所在。根据您的评论更改定义可以解决此问题。非常感谢。很明显,tbl1.col1是否定义为与tbl2中的列不同的数据类型,从而导致缓冲区溢出?如果是这样的话,它是在大容量收集上爆炸的,而不是FORALLHi-Michael,当两个表都有40字节/字符时,一切都正常工作,这可能表明大容量是正确的。我所做的与Oracle站点中的“FORALL语句完成后处理所有异常的示例12-13”大致相同:是的,您要获取的内容必须首先放入集合容器中。如果您将类型ASSARRTYPE IS TABLE of TBL2%ROWTYPE的定义更改为TBL1%ROWTYPE,因为您是从TBL1获取的,那么大容量收集将工作,而错误将发生在Forall insert上-在您想要的位置,Michael,您是对的,这就是问题所在。根据您的评论更改定义可以解决此问题。非常感谢。