我有一个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)。
如果有办法我可以检查真正插入表中的行数是多少?
答案 0 :(得分:0)
引发异常,因此回滚事务。因此,不会插入任何行。