版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、oracle 異常及觸發(fā)器0.異常處置什么是異常情態(tài)異常處置處置的是運轉(zhuǎn)時錯誤,異常分為預(yù)定義異常和用戶自定義異常。聲明異常情態(tài)異常情態(tài)在塊的聲明部分進展聲明,在塊的執(zhí)行部分進展觸發(fā),在塊的異常部分進展處置。用戶定義類型異常情態(tài),需求程序員本人定義代碼,對異常情況進展處置。例:Declare e_toomanystudents exception;1.e_toomanystudents的作用域和本塊的其他變量一樣。預(yù)定義型異常情態(tài)預(yù)定義型異常情態(tài)可以直接運用,沒有必要聲明。Invalid_cursor:當(dāng)執(zhí)行非法的游標操作時,會引發(fā)這個錯誤,如試圖封鎖已封鎖的游標。Cursor_already
2、_open:試圖翻開曾經(jīng)翻開的游標,會引發(fā)這個錯誤。No_data_found:當(dāng)select into語句沒有前往行時,和援用沒有賦值過的pl/sql表的元素時會引發(fā)這個錯誤。Too_may_rows:當(dāng)select into 語句前往多個行時,會引發(fā)這個錯誤。Invalid_number:當(dāng)試圖從字符串轉(zhuǎn)換為數(shù)值失敗時,會引發(fā)這個錯誤,在過程性語句中會引發(fā)value_error錯誤。如:下面的語句引發(fā)invalid_number錯誤,由于x不是數(shù)值。Insert into students(id,first_name,last_name) values (x,scott,smith); 2
3、.Storage_error和program_error:是內(nèi)部的異常情態(tài),通常不會引發(fā)他們。Value_error:當(dāng)在過程性語句中發(fā)生了算術(shù)、轉(zhuǎn)換、截尾或限制性錯誤時會引發(fā)這個情態(tài)。假設(shè)在sql語句中發(fā)生錯誤,會引發(fā)invalid_number錯誤。這個錯誤能夠是一條賦值語句或select into語句的執(zhí)行結(jié)果。下面的兩個例子都引發(fā)value_error錯誤。Declare v_tempvar varchar2(3);Begin v_tempvar:=ABCD;End;Declare v_tempvar number(2);Begin select id into v_tempvar f
4、rom students where last_name=smith;End;3.觸發(fā)異常情態(tài)當(dāng)預(yù)定義的異常情態(tài)錯誤發(fā)生時,就會觸發(fā)該異常情態(tài)。用戶定義的異常情態(tài)由raise語句觸發(fā)。例:Declare e_toomanystudents exception v_currentstudents number(3); v_maxstudents number(3);Begin select current_students,max_students into v_currentstudents,v_maxstudents from classes where department=HIS and
5、 course=101;4. if v_currentstudentsv_maxstudents then raise e_toomanystudents End if;End;當(dāng)引發(fā)異常情態(tài)時,控制轉(zhuǎn)給該塊的異常處置部分。假設(shè)沒有異常處置部分,該異常處置部分將傳給包含該塊的塊。一旦將控制轉(zhuǎn)給異常處置部分,沒有方法再將控制前往給該塊的執(zhí)行部分。處置異常情態(tài)異常部分的語法如下:Exception when exception_name then 處置錯誤語句序列 when exception_name then 處置錯誤語句序列 when others then 處置錯誤語句序列 end;5.一
6、個處置器可以對多個異常情態(tài)進展處置,用or銜接例:Exception when no_data_found or too_many_rows then insert into log_table(info) values (a select error occurred);End;Others異常處置器將對一切語法的異常情態(tài)進展處置,普通放在異常處置的最后,可以保證一切的錯誤都被檢測到。Declare e_toomanystudents exception v_currentstudents number(3); v_maxstudents number(3); v_errorcode num
7、ber; v_errortext varchar2(200);Begin select current_students,max_students into v_currentstudents,v_maxstudents from classes where department=HIS and course=101;6. if v_currentstudentsv_maxstudents then raise e_toomanystudents End if;Exception when e_toomanystudents then insert into log_table(info) v
8、alues (history 101 has | v_currentstudents | students: max allowed is | v_maxstudents); when others then v_errorcode:=sqlcode; v_errortext:=substr(sqlerrm,1,200); insert into log_table(info) values (another error occurred); end;*sqlcode和sqlerrm先被賦值給本地變量,然后這些變量在sql語句中被運用,sqlcode和sqlerrm不能直接在sql語句中運用,
9、由于他們是過程性的函數(shù)。sqlcode前往當(dāng)前的錯誤號,sqlerrm前往當(dāng)前的錯誤信息正文。 7.代碼消息使用的sqlerrm函數(shù)0ora-0000:normal,successful completionsqlerrm(0)+100Ora-1403:no data foundsqlerrm(100)+10User-defined exceptionSqlerrm(10)nullora-0000:normal,successful completionsqlerrm-1Ora-0001:unique constraint(.) violatedSqlerrm(-1)-54Ora-00054:
10、resource busy and acquire by nowait specifiedSqlerrm(-54)8.Exception_init 可以將一個經(jīng)過命名的異常情態(tài)與一個特別的oracle錯誤相聯(lián)絡(luò)。這樣可以用when撲獲此錯誤,不用others撲獲。經(jīng)過exception_init pragma實現(xiàn)的。其語法如下:Pragma exception_init (exception_name,oracle_error_number)Pragma必需在聲明部分例:下面的例子在運轉(zhuǎn)時辰如遇到“ora-1400:mandatory not null column missing or nu
11、ll during insert錯誤時,將引發(fā)e_missingnull異常情態(tài)。Declare e_missingnull exception; pragma exception_init (e_missingnull,-1400);Begin insert into students(id) values(null);Exception when e_missingnull then insert into log_table(info) values(ora-1400 occurred);End;9.每次發(fā)生pragma exception_init時,一個oracle錯誤只能和一個用戶
12、定義的異常情態(tài)相關(guān)聯(lián)。在異常處置器內(nèi)部,sqlcode和sqlerrm將前往發(fā)生oracle錯誤的代碼和錯誤信息,而不會前往用戶定義的音訊。例:Declare ex_hfy exception;Pragma exception_init(ex_hfy,-1400);Begin insert into students values(null);Exception when ex_hfy then dbms_output.put_line(不能把空值插入到非空列);End;留意,這里-1400不能為別的,由于把空值插入到非空列的錯誤號就是這個??梢詥为殘?zhí)行insert語句查看錯誤號。10.運用r
13、aise_application_error可以用raise_application_error創(chuàng)建本人的錯誤音訊,這比命名的異常情態(tài)更具有闡明性。其語法如下:Raise_application_error(error_number,error_message,keep-errors);這里error_number是從20,000到20,999之間的數(shù),error_message是與此錯誤相關(guān)的錯誤正文。Keep_errors為布爾值,假設(shè)他為true,那么新的錯誤被添加到曾經(jīng)引發(fā)的錯誤列表中假設(shè)有的話。假設(shè)為false為缺省值,那么新的錯誤將交換錯誤的當(dāng)前列表。例:下面的過程為一個新的學(xué)生注
14、冊以前,檢查能否在班級中有足夠的地方包容他。11. Create or replace procedure register( p_studentid in students.id%type, p_department in classes.department%type, p_course in classes.course%type) as v_currentstudents number; v_maxstudents number;Begin select current_students,max_students into v_currentstudent,v_maxstudents
15、from classes where department=p_department and course=p_course; 12. if v_currentstudents+1v_maxstudents then raise_application_error(-20000, cant add more students to | p_department | |p_course); end if; classpackage.addstudent(p_studentid, p_department,p_course);Exception when no_data_found then ra
16、ise_application_error(-20001,p_department | | p_course | doesnt exist!);End register;以上程序運轉(zhuǎn)時,當(dāng)沒有足夠的空間包容新的學(xué)生時,前往ora-20000: cant add more students to his 101錯誤音訊。13.觸發(fā)器綜述觸發(fā)器可以了解為特殊的存儲過程。當(dāng)運用程序用一條滿足觸發(fā)器條件的SQL DML語句指向與觸發(fā)器相銜接的表時,Oracle將自動執(zhí)行該觸發(fā)器以執(zhí)行義務(wù)。DML觸發(fā)器,定義在對數(shù)據(jù)庫表的支配行為insert,delete,update)上的觸發(fā)器。前觸發(fā)器、后觸發(fā)器。
17、語句觸發(fā)、行觸發(fā)14.觸發(fā)器15.觸發(fā)器16.觸發(fā)器關(guān)于觸發(fā)器中的old和new關(guān)鍵字:old表示數(shù)據(jù)支配前的值,old只對UPDATE和DELETE操作。new表示數(shù)據(jù)支配后的值,new只對UPDATE和INSERT操作。17.觸發(fā)器定義的普通語法:CREATE OR REPLACE TRIGGER triggerBEFORE|AFTERDELETE|INSERT|UPDATE OF column ,columnORDELETE|INSERT|UPDATE OF column ,columnON tableFOR EACH ROW WHEN conditionBEGINpl/sql bloc
18、k.END trigger18.觸發(fā)器例如CREATE OR REPLACE TRIGGER logempBEFORE INSERT OR UPDATE OR DELETE ON empFOR EACH ROWDECLAREstatementtype CHAR(20);BEGINIF INSERTING THENstatementtype:=INSERT TRIGGER!;ELSIF UPDATING THENstatementtype:=UPDATE TRIGGER!;ELSEstatementtype:=DELETE TRIGGER!;END IF;DBMS_OUTPUT.PUT_LINE(statementtype);END;19.觸發(fā)器例如下面分別做插入、刪除和修正操作,察看結(jié)果:insert into emp (empno,ename) values( 7938, JK);INSERT TRIGGER
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)管理行業(yè)安全生產(chǎn)工作總結(jié)
- 門診導(dǎo)醫(yī)服務(wù)總結(jié)
- 傳媒行業(yè)營銷實踐總結(jié)
- 娛樂行業(yè)客服崗位總結(jié)
- 《眼貼體驗思路》課件
- 《羅蘭貝格品牌戰(zhàn)略》課件
- 2024年廣東省東莞市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2023年陜西省渭南市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2023年福建省莆田市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2021年四川省資陽市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 93江蘇省宿遷市泗洪縣2023-2024學(xué)年八年級上學(xué)期期末英語試題()
- 教學(xué)能力大賽決賽獲獎-教學(xué)實施報告-(完整圖文版)
- 亞朵酒店管理手冊
- 高一期末家長會課件
- 2024年航空職業(yè)技能鑒定考試-航空乘務(wù)員危險品歷年考試高頻考點試題附帶答案
- 醫(yī)院禁毒行動方案
- 設(shè)立影視服務(wù)公司商業(yè)計劃書
- 《流行性腦脊髓膜炎》課件
- 學(xué)生公寓物業(yè)服務(wù)方案投標方案(技術(shù)方案)
- 水上交通安全生產(chǎn)培訓(xùn)
- 超聲影像學(xué)基礎(chǔ)
評論
0/150
提交評論