oracle 事务
1、事務(wù)概念
事務(wù)用于保證數(shù)據(jù)的一致性,它由一組相關(guān)的dml語(yǔ)句組成,該組的dml(數(shù)據(jù)操作語(yǔ)言,增刪改,沒(méi)有查詢)語(yǔ)句要么全部成功,要么全部失敗。
2.語(yǔ)法
begin
dml1
dml2
dml3;
commit;
rollback;
end;
eg:
?
約束:alter table student
add constraint ck_student_stuage check(stuage>16 and stuage<40);
執(zhí)行以下命令:
begin
insert into student values('201701001','金允誠(chéng)','男',23,'電子競(jìng)技','競(jìng)技1班',to_date('2002/8/27','yyyy/mm/dd'));
insert into student values('201701002','金允','男',10,'電子競(jìng)技','競(jìng)技2班',to_date('2002/9/27','yyyy/mm/dd'));
insert into student values('201701003','金誠(chéng)','男',29,'電子競(jìng)技','競(jìng)技3班',to_date('2002/10/27','yyyy/mm/dd'));
commit;
exception
when others then
rollback;
dbms_output.put_line('錯(cuò)誤信息:'|| sqlerrm);
end;
執(zhí)行結(jié)果:
執(zhí)行以下命令:
begin
insert into student values('201701001','金允誠(chéng)','男',23,'電子競(jìng)技','競(jìng)技1班',to_date('2002/8/27','yyyy/mm/dd'));
insert into student values('201701002','金允','男',20,'電子競(jìng)技','競(jìng)技2班',to_date('2002/9/27','yyyy/mm/dd'));
insert into student values('201701003','金誠(chéng)','男',29,'電子競(jìng)技','競(jìng)技3班',to_date('2002/10/27','yyyy/mm/dd'));
commit;
exception
when others then
rollback;
dbms_output.put_line('錯(cuò)誤信息:'|| sqlerrm);
end;
執(zhí)行結(jié)果:
?
執(zhí)行以下命令:
begin
insert into student values('201701011','金允誠(chéng)','男',23,'電子競(jìng)技','競(jìng)技1班',to_date('2002/8/27','yyyy/mm/dd'));
insert into student values('201701012','金允','男',20,'電子競(jìng)技','競(jìng)技2班',to_date('2002/9/27','yyyy/mm/dd'));
insert into student values('201701013','金誠(chéng)','男',29,'電子競(jìng)技','競(jìng)技3班',to_date('2002/10/27','yyyy/mm/dd'));
rollback;
exception
when others then
commit;
dbms_output.put_line('錯(cuò)誤信息:'|| sqlerrm);
end;
執(zhí)行結(jié)果:
執(zhí)行以下命令:
begin
insert into student values('201701011','金允誠(chéng)','男',23,'電子競(jìng)技','競(jìng)技1班',to_date('2002/8/27','yyyy/mm/dd'));
insert into student values('201701012','金允','男',20,'電子競(jìng)技','競(jìng)技2班',to_date('2002/9/27','yyyy/mm/dd'));
insert into student values('201701013','金誠(chéng)','男',9,'電子競(jìng)技','競(jìng)技3班',to_date('2002/10/27','yyyy/mm/dd'));
rollback;
exception
when others then
commit;
dbms_output.put_line('錯(cuò)誤信息:'|| sqlerrm);
end;
--3條dml中第3條錯(cuò)誤,違反檢查約束,不執(zhí)行rollback,執(zhí)行下行命令commit。注意在oracle事務(wù)中,當(dāng)執(zhí)行到錯(cuò)誤dml時(shí),之后的dml也就不會(huì)繼續(xù)執(zhí)行。
在oracle事務(wù)語(yǔ)句中必須要有begin和end,并且以end結(jié)尾,至于中間加入什么語(yǔ)句不影響該事務(wù)執(zhí)行。
?
3、exception 異常處理
???? 有兩種類(lèi)型的異常,一種為內(nèi)部異常,一種為用戶自定義異常,內(nèi)部異常是執(zhí)行期間返回到PL/SQL塊的ORACLE錯(cuò)誤或由PL/SQL代碼的某操作引起的錯(cuò)誤,如除數(shù)為零或內(nèi)存溢出的情況。用戶自定義異常由開(kāi)發(fā)者顯示定義,在PL/SQL塊中傳遞信息以控制對(duì)于應(yīng)用的錯(cuò)誤處理。
?? 常見(jiàn)的異常:
no_data_found ?? ?? ora-01403 +100 select into 語(yǔ)句沒(méi)有符合條件的記錄返回
too_many_rows ? ora-01422 -1422 ? ? select into 語(yǔ)句符合條件的記錄有多條返回
dup_val_on_index ora-00001 -1 ???? ? 對(duì)于數(shù)據(jù)庫(kù)表中的某一列,該列已經(jīng)被限制為唯一索引,程序試圖存儲(chǔ)兩個(gè)重復(fù)的值
value_error ora-06502 -6502 ????????? 在轉(zhuǎn)換字符類(lèi)型,截取或長(zhǎng)度受限時(shí),會(huì)發(fā)生該異常,如一個(gè)字符分配給一個(gè)變量,而該變量聲明的長(zhǎng)度比該字符短,就會(huì)引發(fā)該異常
storage_error ora-06500 -6500 ? ? 內(nèi)存溢出
zero_divide ora-01476 -1476 ????? 除數(shù)為零
case_not_found ora-06592 -6530 ? 對(duì)于選擇case語(yǔ)句,沒(méi)有與之相匹配的條件,同時(shí),也沒(méi)有else語(yǔ)句捕獲其他的條件
cursor_already_open ora-06511 -6511 程序試圖打開(kāi)一個(gè)已經(jīng)打開(kāi)的游標(biāo)
timeout_on_resource ora-00051 -51 ? ? ? 系統(tǒng)在等待某一資源,時(shí)間超時(shí)
如果要處理未命名的內(nèi)部異常,必須使用OTHERS異常處理器
一般在begin之前加declare聲明語(yǔ)句,聲明異常名
用DBMS_output.putline('聲明的異常名:'|| sqlcode or sqlerrm)? 可以在sql窗口下的輸出窗口找到報(bào)錯(cuò)信息。
?
?
Oracle內(nèi)置函數(shù)SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來(lái)返回Oracle的錯(cuò)誤代碼和錯(cuò)誤消息。
OTHERS處理器應(yīng)該是異常處理塊中的最后的異常處理器,因?yàn)樗怯脕?lái)捕獲除了別的異常處理器處理以外的所有的Oracle異常,所以在程序的最外層使用一個(gè)OTHERS處理器的話,將可以確保所有的錯(cuò)誤都會(huì)被檢測(cè)到。
在一個(gè)內(nèi)在的異常中,SQLCODE返回Oracle錯(cuò)誤的序號(hào),而SQLERRM返回的是相應(yīng)的錯(cuò)誤消息,錯(cuò)誤消息首先顯示的是錯(cuò)誤代碼。
SQLCODE返回的是負(fù)數(shù),除非Oracle的錯(cuò)誤為“ORA-01403:NO DATA FOUND”(譯:ORA-01403:未找到數(shù)據(jù)),當(dāng)Oracle錯(cuò)誤為“ORA-01403:NO DATA FOUND”時(shí),其對(duì)應(yīng)的SQLCODE為+100。對(duì)于用戶自定義的異常,SQLCODE返回的是+1,而SQLERRM返回的是User-Defined Exception
如果沒(méi)有異常被觸發(fā),則SQLCODE返回0,SQLERRM返回“ORA-0000:normal, successful completion”。(轉(zhuǎn)自http://blog.csdn.net/azkaser/article/details/4925084)
?
轉(zhuǎn)載于:https://www.cnblogs.com/dopaer/p/6379480.html
總結(jié)
- 上一篇: V-rep学习笔记:vrep中的实用工具
- 下一篇: zookeeper在Dubbo中的作用