【问题标题】:INSERT ALL - report which insert cause exceptionINSERT ALL - 报告哪个插入导致异常
【发布时间】:2016-02-19 12:31:59
【问题描述】:

我必须找到任何方法来报告 INSERT ALL 子句中的插入损坏。
我需要知道究竟哪一行是无效的,并将其插入到特殊的日志表中。 有可能做到这一点吗?

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

【问题讨论】:

  • 请暂停代码示例。

标签: sql oracle plsql sql-insert


【解决方案1】:

是的,您可以使用 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

【讨论】:

  • 我在这里看到一个问题,我需要为系统中的每个表创建错误表?
  • 还有一个问题:它可以与 insert all 子句一起使用吗?
【解决方案2】:

这里还有一个选项 使用“保存异常”子句保存异常

  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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多