我有一个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)。
如果有一种方法我可以检查有多少行真的插入到表中?引发异常,因此事务被回滚。因此,不插入任何行