3

この例 ( DUP_VAL_ON_INDEX Exception ) を考えると、制約に違反した値をキャプチャしてログに記録することは可能ですか?

一括挿入によって複数の違反が発生した場合、アプローチは同じですか?

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 に答える