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

时间:2015-08-28 13:52:45

标签: oracle plsql

我有一个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插入ZERO行,它似乎也可以正常工作。 例如,如果我插入10行,我会得到:

Error #1, iter: 11, code: 1654, ORA-01654: unable to extend index TEST_SOL11_XS43018_USER_FULL.SYS_C00146274 by 128 in tablespace USERS_FULL
Statement #1 inserted 1 rows.
Statement #2 inserted 1 rows.
Statement #3 inserted 1 rows.
Statement #4 inserted 1 rows.
Statement #5 inserted 1 rows.
Statement #6 inserted 1 rows.
Statement #7 inserted 1 rows.
Statement #8 inserted 1 rows.
Statement #9 inserted 1 rows.
Statement #10 inserted 1 rows.

所以我得到一个SINGLE错误,这是在迭代#11声明的(但是我的循环是1..10)。似乎前10次迭代工作,至少它接缝打印SQL%BULK_ROWCOUNT(i)

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

如果有办法我可以检查真正插入表中的行数是多少?

1 个答案:

答案 0 :(得分:0)

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