Oracle:所有保存异常均不起作用

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

我正在尝试使用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:数字或值错误:大容量绑定:截断绑定”


提前感谢您的帮助。

要问一个明显的问题,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,您是对的,这就是问题所在。根据您的评论更改定义可以解决此问题。非常感谢。