業務場景:sql
當一個DML運行的時候,若是遇到了錯誤,則這條語句會整個回滾,就好像沒有執行過。不過對於一個大的DML而言,若是個別數據錯誤而致使整個語句的回滾,會浪費不少的資源和運行時間,從10g開始Oracle支持記錄DML語句的錯誤,而容許語句自動繼續執行。ide
DBMS_ERRLOG提供了一個存儲過程CREATE_ERROR_LOG,這個存儲過程建立一個錯誤日誌表,當DML出錯時,操做不會終止和回滾,而是將相關的錯誤寫到錯誤日誌表中。
CREATE_ERROR_LOG不支持一些數據類型:LONG, CLOB,BLOB, BFILE, and ADT。oop
簡單實例:測試
1.建立test2表fetch
2.調用存儲過程自動建立相應的錯誤日誌表日誌
begin
dbms_errlog.create_error_log('TEST2','LOG_TEST2');
end;ip
相應的錯誤日誌表LOG_TEST2結構資源
3.測試it
執行兩次一下sql語句pip
insert into test2 values('1','zhangsan') LOG ERRORS INTO LOG_TEST2 REJECT LIMIT UNLIMITED;
而後查看test2表和Log_test2表
4.注意事項:
報錯信息:
begin case declare exit for
goto if loop mod null pragma raise return select update while
with <an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
pipe
極可能是存儲過程當中可能出現全角的空格,這種錯是不可見的,存儲過程只接受半角的空格,這種錯誤屬於比較難查的。好比$符是識別不了的。