3

鉴于此示例(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;
4

2 回答 2

5

理想情况下,我建议使用 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创建一个嵌套的异常表,然后您可以对其进行迭代。

于 2012-11-26T16:41:35.497 回答
0

对于有兴趣了解更多有关此内容的人,请通过此链接

于 2020-10-23T13:16:29.180 回答