The SAVE EXCEPTIONS clause will record any exception during the bulk operation, and continue process

The SAVE EXCEPTIONS clause will record any exception during the bulk operation, and continue processing.
  
http://www.java2s.com/Code/Oracle/PL-SQL/TheSAVEEXCEPTIONSclausewillrecordanyexceptionduringthebulkoperationandcontinueprocessing.htm
http://docs.oracle.com/cd/E21901_01/doc/timesten.1122/e21639/sqlexamples.htm#TTPLS364
http://psoug.org/reference/array_processing.html

SQL>

SQL> CREATE TABLE MyTable (
  2    num_col    NUMBER,
  3    char_col   VARCHAR2(60)
  4    );

Table created.

SQL>
SQL>
SQL> DECLARE
  2    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE
  3      INDEX BY BINARY_INTEGER;
  4    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE
  5      INDEX BY BINARY_INTEGER;
  6    v_Strings t_Strings;
  7    v_Numbers t_Numbers;
  8    v_NumErrors NUMBER;
  9  BEGIN
 10    DELETE FROM MyTable;
 11    FOR v_Count IN 1..10 LOOP
 12      v_Strings(v_Count:= '123456789012345678901234567890';
 13      v_Numbers(v_Count:= v_Count;
 14    END LOOP;
 15
 16    FORALL v_Count IN 1..10
 17      INSERT INTO MyTable (num_col, char_col)
 18        VALUES (v_Numbers(v_Count), v_Strings(v_Count));
 19
 20    v_Strings(6:= v_Strings(6|| 'a';
 21
 22    FORALL v_Count IN 1..10 SAVE EXCEPTIONS
 23      UPDATE MyTable
 24        SET char_col = char_col || v_Strings(v_Count)
 25        WHERE num_col = v_Numbers(v_Count);
 26  EXCEPTION
 27    WHEN OTHERS THEN
 28      DBMS_OUTPUT.PUT_LINE('Got exception: ' || SQLERRM);
 29      v_NumErrors := SQL%BULK_EXCEPTIONS.COUNT;
 30      DBMS_OUTPUT.PUT_LINE(
 31        'Number of errors during processing: ' || v_NumErrors);
 32      FOR v_Count IN 1..v_NumErrors LOOP
 33        DBMS_OUTPUT.PUT_LINE('Error ' || v_Count || ', iteration ' ||
 34          SQL%BULK_EXCEPTIONS(v_Count).error_index || ' is: ' ||
 35          SQLERRM(- SQL%BULK_EXCEPTIONS(v_Count).error_code));
 36      END LOOP;
 37
 38      COMMIT;
 39  END;
 40  /
Got exception: ORA-24381: error(sin array DML
Number of errors during processing: 1
Error 1, iteration is: ORA-12899: value too large for column  (actual: , maximum: )

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> drop table MyTable;

Table dropped.

SQL>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值