當乙個
dml執行的時候,如果遇到了錯誤,則這條語句會整個回滾,就好像沒有執行過。不過對於乙個大的
dml而言,如果個別資料錯誤而導致整個語句的回滾,會浪費很多的資源和執行時間,從
10g開始
oracle
支援記錄
dml語句的錯誤,而允許語句自動繼續執行。下面介紹一下
dml記錄語句的用法。
看乙個插入語句的簡單例子:
sql> create table t1 as select rownum a,rownum b from dba_segments where rownum <=10;
table created
sql> create table t2 as select rownum a,rownum b from dba_segments where rownum <=20;
table created
sql> alter table t1 add constraint pk_t1_a primary key(a);
table altered
sql> insert into t1 select * from t2;
insert into t1 select * from t2
ora-00001: 違反唯一約束條件 (nrei.pk_t1_a)
可以看到,由於插入的資料違反了唯一性約束,導致了
oracle
報錯。
下面建立記錄
dml錯誤資訊的記錄表,通過
dbms_errlog
包來進行建立,而這個包目前只包括這乙個過程:
procedure create_error_log(dml_table_name varchar2,
err_log_table_name varchar2 default null,
err_log_table_owner varchar2 default null,
err_log_table_space varchar2 default null,
skip_unsupported boolean default false);
利用create_error_log
來建立t1
表的dml
錯誤記錄表:
可以看到oracle
建立的錯誤記錄表包括錯誤號碼ora_err_number$,錯誤資訊ora_err_mesg$,記錄的rowid資訊ora_err_rowid$,錯誤操作型別ora_err_optyp$,錯誤標籤ora_err_tag$,以及表中對應的列。
下面利用包含
log error
語句的insert
語句再次插入資料:
10條。從對應的錯誤資訊表中已經包含了插入的資訊。而且從錯誤資訊表中還可以看到對應的錯誤號和詳細錯誤資訊,ora_err_optyp$為
錯誤操作型別,i表示為insert
關於log errors的語法,into語句後面跟隨的就是指定的錯誤記錄表的表名。
在into語句後面,可以跟隨乙個表示式('err_t1')即是ora_err_tag$中儲存的資訊,用來設定本次語句執行的錯誤在錯誤記錄表中對應的tag
。有了這個語句,就可以很輕易的在錯誤記錄表中找到某次操作所對應的所有的錯誤,這對於錯誤記錄表中包含了大量資料,且本次語句產生了多條錯誤資訊的情況十分有幫助。只要這個表示式的值可以轉化為字串型別就可以。
而reject limit
則限制語句出錯的數量。
sql> insert into t1 select * from t2 log errors into err_t1('err_t1')reject limit 1;
insert into t1 select * from t2 log errors into err_t1('err_t1')reject limit 1
ora-00001: 違反唯一約束條件 (nrei.pk_t1_a)
可以看到,當設定的reject limit的值小於出錯記錄數時,語句會報錯,這時log errors語句沒有起到應有的作用,插入語句仍然以報錯結束。而如果將reject limit的限制設定大於等於出錯的記錄數,則插入語句就會執行成功。而所有出錯的資訊都會儲存到log error對應的表中。
只要指定了log errors語句,不管最終插入語句十分成功的執行完成,在錯誤記錄表中都會記錄語句執行過程中遇到的錯誤。比如第乙個插入由於出錯數目超過reject limit的限制,這時在記錄表中會存在reject limit + 1條記錄數,因此這條記錄錯誤導致了整個sql語句的報錯。
如果不管碰到多少錯誤,都希望語句能繼續執行,則可以設定reject limit為unlimited
需要注意的是,
即是做了回滾操作,
err_t1
表中的記錄並不會減少,因為
oracle
是利用自治事務的方式插入錯誤記錄表的。
DBMS ERRLOG記錄DML錯誤日誌(二)
dml記錄語句的限制,雖然所有的例子都是利用 insert 語句,但是 log errors 語句並沒有這個限制,update delete 和merge 都可以使用這個語句。下面要說的就是這篇的重點,log errors 語句的限制。不支援的操作 違反延遲約束 直接路徑的insert或merge語...
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...