DBMS ERRLOG記錄DML錯誤日誌(二)

2021-09-06 20:50:40 字數 3198 閱讀 2384

dml記錄語句的限制,雖然所有的例子都是利用

insert

語句,但是

log errors

語句並沒有這個限制,

update

、delete

和merge

都可以使用這個語句。下面要說的就是這篇的重點,

log errors

語句的限制。

不支援的操作:

違反延遲約束;

直接路徑的insert或merge語句違反了唯一約束或唯一索引;

更新操作違反了唯一約束或唯一索引。

不支援的資料型別:

比如:long、long raw、blog、clob、nclob、bfile以及各種物件型別。oracle不支援這些型別的原因也很簡單,這些特殊的型別不是包含了大量的記錄,就是需要通過特殊的方法來讀取,因此oracle沒有辦法在sql處理的時候將對應列的資訊寫到錯誤記錄表中。

1.下面我們來看不支援的操作,首先看一下違反延遲約束,

sql> alter table t1 add constraint pk_t1_b check (b is not null) deferrable initially deferred;

table altered

測試語句:

sql> insert into t1 values('21','') log errors into err_t1('err_t1')reject limit unlimited;

1 row inserted

sql> commit;

commit

ora-02091: 事務處理已回退

ora-02290: 違反檢查約束條件 (nrei.pk_t1_b)

由於延遲約束的檢查在commit時刻進行,而不是在dml發生的時刻,因此不會利用log errors語句將違反結果的記錄插入到記錄表中,這也是很容易理解的。

下面看看直接路徑插入違反唯一約束的情況:

直接路徑插入本身就很特殊,在執行過程中會繞過很多常規sql執行的步驟,因此log errors語句對其無效也是可以理解的。

最後來看看更新語句違反唯一約束的情況:

sql> update t1 set a='1' where a='2' log errors into err_t1('err_t1')reject limit unlimited;

update t1 set a='1' where a='2' log errors into err_t1('err_t1')reject limit unlimited

ora-00001: 違反唯一約束條件 (nrei.pk_t1_a)

可以看到,如果更新操作導致了唯一約束或唯一索引衝突,也是不會記錄到錯誤記錄表中的。至於為什麼更新操作會產生這種情況,還沒有想明白,不過主鍵的衝突和其他約束衝突有所區別,

oracle

在處理的時候很可能會有所考慮。

2.下面我們來看不支援的資料型別

sql> drop table err_t1 purge;

table dropped

sql> alter table t1 add c clob;

table altered

sql> exec dbms_errlog.create_error_log('t1','err_t1','nrei');

begin dbms_errlog.create_error_log('t1','err_t1','nrei'); end;

ora-20069: unsupported column type(s) found: c

ora-06512: 在 "sys.dbms_errlog", line 234

ora-06512: 在 line 1

可以看到,由於t1表擁有不支援的列,導致建立錯誤記錄表的過程報錯,錯誤提示就是t1表中包含了不支援的列。

如果手工新增clob欄位到錯誤記錄表:

sql> alter table t1 drop (c);

table altered

sql> exec dbms_errlog.create_error_log('t1','err_t1','nrei');

pl/sql procedure successfully completed

sql> alter table t1 add c clob;

table altered

sql> alter table err_t1 add c clob;

table altered

執行插入語句:

sql> insert into t1 values('21','21','test') log errors into err_t1('err_t1')reject limit unlimited;

insert into t1 values('21','21','test') log errors into err_t1('err_t1')reject limit unlimited

ora-38904: lob 列 "c" 不支援 dml 錯誤事件記錄

可以看到,

oracle

會直接報錯。

sql> update t1 set a='22' where a='2' log errors into err_t1('err_t1')reject limit unlimited;

update t1 set a='22' where a='2' log errors into err_t1('err_t1')reject limit unlimited

ora-38904: lob 列 "c" 不支援 dml 錯誤事件記錄

而oracle

的dml

並不包含不支援列的資料,

oracle

也會報錯,說明

oracle

是在執行之前檢查了錯誤記錄表的資料型別,而不是在執行的時候才去處理。

sql> alter table err_t1 drop (c);

table altered

sql> insert into t1 values('1','1','test' ) log errors into err_t1('err_t1')reject limit unlimited;

0 rows inserted

可以看到,刪除錯誤記錄語句所不支援的列後,

log errors

語句反而可以順利執行,而且無論

dml語句是否包括哪些不支援列的資料。

DBMS ERRLOG記錄DML錯誤日誌(二)

dml記錄語句的限制,雖然所有的例子都是利用 insert 語句,但是 log errors 語句並沒有這個限制,update delete 和merge 都可以使用這個語句。下面要說的就是這篇的重點,log errors 語句的限制。不支援的操作 違反延遲約束 直接路徑的insert或merge語...

DBMS ERRLOG記錄DML錯誤日誌(一)

當乙個 dml執行的時候,如果遇到了錯誤,則這條語句會整個回滾,就好像沒有執行過。不過對於乙個大的 dml而言,如果個別資料錯誤而導致整個語句的回滾,會浪費很多的資源和執行時間,從 10g開始 oracle 支援記錄 dml語句的錯誤,而允許語句自動繼續執行。下面介紹一下 dml記錄語句的用法。看乙...

資料的增刪改查 DML(學習記錄四 )

二 修改語句 三 刪除語句 語法 insert into 表名 列名,values 值1,select from beauty 1.插入的值的型別要與列的型別一致或相容 insert into beauty id,name,borndate,phone,photo,boyfriend id valu...