2012-11-26 134 views
2

鑑於此示例(DUP_VAL_ON_INDEX Exception),是否有可能捕獲違反約束的值以便它們可能被記錄?捕獲觸發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; 
+1

:是的,這種方法可以正常工作,但是使用':New。',這是'unique',你發現可能會拋出'DUP_VAL_ON_INDEX錯誤'將被捕獲。另一件事,如果你沒有提高錯誤,那麼它也可以用於批量插入。在異常'DUP_VAL_ON_INDEX'dnt引發異常。 –

回答

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。這樣會比較慢,但是您可以使用FORALL語句的SAVE EXCEPTIONS子句創建一個可以迭代的異常嵌套表。

相關問題