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