bulk update with exception handling

on
CREATE TABLE tmp_table (aaa VARCHAR2(100) NOT NULL);

DECLARE

  TYPE t_varchar IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
  a_varchar t_varchar;
  e_bulk_errors             EXCEPTION;
  t_error_index             PLS_INTEGER;
  PRAGMA EXCEPTION_INIT(e_bulk_errors,-24381);

BEGIN

  a_varchar(1) := 'aaa';
  a_varchar(2) := NULL;
  a_varchar(4) := NULL;
  a_varchar(5) := 'eee';
  a_varchar(7) := 'fff';
  a_varchar(8) := 'ggg';
  a_varchar(9) := NULL;

  FORALL i IN INDICES OF a_varchar SAVE EXCEPTIONS
    INSERT INTO tmp_table (aaa) VALUES (a_varchar(i)); 

EXCEPTION
  WHEN e_bulk_errors
  THEN
    FOR i IN 1..SQL%bulk_exceptions.COUNT
    LOOP
      t_error_index    := SQL%BULK_EXCEPTIONS(i).error_index;
      dbms_output.put_line(i||' error code  '||SQL%BULK_EXCEPTIONS(i).error_code);
      dbms_output.put_line(i||' error index '||t_error_index);
    END LOOP;
END;

One drawback here is the t_error_index. That’s not the index from a_varchar, but an sequential index. So in this case the last error is raised for a_varchar(9). But sequential this is the 7th record in the plsql table. so in this case t_error_index containt number 7 and NOT 9. Be assured to have n index in a_varchar without gaps.