INSERT ALL - 报告哪个插入导致异常

时间:2016-02-19 12:32:00

标签: sql oracle plsql sql-insert

我必须找到在 INSERT ALL 子句中报告损坏插入的任何方法。
我需要知道哪些行完全无效并将其插入特殊的日志表中。 可以这样做吗?

我正在尝试在插入之前和之后在表上写入触发器,但是如果抛出任何异常则它不起作用。 另一个想法是写入过程将 INSERT ALL 转换为单个 INSERT 并在循环中执行它,在此捕获异常之后,但我遇到了实现这个想法的麻烦。 / p>

2 个答案:

答案 0 :(得分:2)

是的,您可以使用DML错误记录子句

INSERT INTO dw_empl
SELECT employee_id, first_name, last_name, hire_date, salary, department_id 
FROM employees
WHERE hire_date > sysdate - 7
LOG ERRORS INTO err_empl ('daily_load') REJECT LIMIT 25

详情请点击此处: https://docs.oracle.com/cd/B28359_01/server.111/b28310/tables004.htm

答案 1 :(得分:0)

这里还有一个选项 保存例外"保存例外"条款

  forall i in v_data_list.first .. v_data_list.last save exceptions
    insert into original_table values v_data_list (i);

然后迭代保存的异常

  exception
      when others then
        if sqlcode = -24381 then
          for indx in 1 .. sql%bulk_exceptions.count loop
            Pkg_log_err.log_error(p_Sqlcode => sql%bulk_exceptions(indx).error_code,
                                  p_Sqlerrm => sqlerrm(-sql%bulk_exceptions(indx).error_code));
          end loop;