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執行的時候,如果遇到了錯誤,則這條語句會整個回滾,就好像沒有執行過。不過對於乙個大的 dml而言,如果個別資料錯誤而導致整個語句的回滾,會浪費很多的資源和執行時間,從 10g開始 oracle 支援記錄 dml語句的錯誤,而允許語句自動繼續執行。下面介紹一下 dml記錄語句的用法。看乙...
DBMS ERRLOG記錄DML錯誤日誌(二)
dml記錄語句的限制,雖然所有的例子都是利用 insert 語句,但是 log errors 語句並沒有這個限制,update delete 和merge 都可以使用這個語句。下面要說的就是這篇的重點,log errors 語句的限制。不支援的操作 違反延遲約束 直接路徑的insert或merge語...
資料的增刪改查 DML(學習記錄四 )
二 修改語句 三 刪除語句 語法 insert into 表名 列名,values 值1,select from beauty 1.插入的值的型別要與列的型別一致或相容 insert into beauty id,name,borndate,phone,photo,boyfriend id valu...