Oracle pl/sql forall:如何计算实际插入行数与表空间满(1654)错误



我有一个PL/SQL函数,它批量插入许多行到表中。我想知道有多少行是正确插入的,有多少行有问题(Oracle版本11g)。

我这样做了:

   (...)
   BEGIN
       FORALL i IN 1 .. num SAVE EXCEPTIONS
           insert into mytable values (myarr(i));
       EXCEPTION
       WHEN OTHERS THEN
           l_error_count := SQL%BULK_EXCEPTIONS.count;
           FOR i in 1 .. l_error_count LOOP
               dbms_output.put_line('Error #' || i || ',
                 iter: ' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX ||
                 ', code: ' || SQL%BULK_EXCEPTIONS(i).ERROR_CODE ||
                 ', ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
           END LOOP;
   END;
   FOR i IN 1 .. num LOOP
       DBMS_OUTPUT.PUT_LINE('Statement #' || i || ' inserted ' ||
         SQL%BULK_ROWCOUNT(i) || ' rows.');
   END LOOP;
   commit;
   (...)

通常它工作正常给出有错误的确切数字或行(重复id等),我可以每行列出一个错误。

当表空间用完时,问题就来了(这是我无法控制的……):在这种情况下,即使forall插入零行,似乎也能正常工作。例如,如果我插入10行,我得到:

<>之前错误#1,iter: 11,代码:1654,ORA-01654:无法扩展索引TEstrongOL11_XS43018_USER_FULL。SYS_C00146274表空间USERS_FULL语句1插入1行。语句2插入1行。语句3插入1行。语句4插入1行。语句5插入1行。语句6插入1行。语句7插入1行。语句8插入1行。语句#9插入1行。语句10插入1行。之前

所以我得到一个单一的错误,这是在迭代#11声明(但我的循环是1..10)。看起来前面的10次迭代是有效的,至少它可以打印SQL%BULK_ROWCOUNT(i)

如果没有真正写入raw,因为表空间已满(并且我通过计算前后行来双重检查id)。

如果有一种方法我可以检查有多少行真的插入到表中?

引发异常,因此事务被回滚。因此,不插入任何行

最新更新