触发DUP_VAL_ON_INDEX捕捉值(Capture values that trigger

2019-07-04 04:00发布

鉴于这种例子( DUP_VAL_ON_INDEX例外 ),才可能捕捉违反了约束,使他们可能会记录值是多少?

请问方法是相同的,如果有一个批量插入产生多个违规?

BEGIN
  -- want to capture '01' and '02'
  INSERT INTO Employee(ID)
  SELECT ID
  FROM (
    SELECT '01' ID FROM DUAL
    UNION
    SELECT '02' ID FROM DUAL
  );

EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    -- log values here
    DBMS_OUTPUT.PUT_LINE('Duplicate value on an index');
END;

Answer 1:

理想情况下,我会建议使用DML错误记录。 例如

创建错误日志表

begin
  dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
                                err_log_table_name => 'EMPLOYEE_ERR' );
end;

使用DML错误记录

BEGIN
  insert into employee( id )
    select id 
      from (select '01' id from dual
            union all
            select '02' from dual) 
    log errors into employee_err
        reject limit unlimited;
END;

对于失败的每一行,这将对于该行的数据登录到EMPLOYEE_ERR表除外一起。 然后,您可以查询错误日志表看到所有的错误,而不是仅仅得到失败的第一行。

如果创建错误日志表是不是一种选择,你可以从SQL到PL / SQL与大容量操作移动。 这将是慢,但你可以使用SAVE EXCEPTIONS的条款FORALL语句来创建例外然后你可以遍历的嵌套表。



文章来源: Capture values that trigger DUP_VAL_ON_INDEX