版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
oracle異常及觸發(fā)器0異常處理什么是異常情態(tài)異常處理處理的是運(yùn)行時(shí)錯(cuò)誤,異常分為預(yù)定義異常和用戶(hù)自定義異常。聲明異常情態(tài)異常情態(tài)在塊的聲明部分進(jìn)行聲明,在塊的執(zhí)行部分進(jìn)行觸發(fā),在塊的異常部分進(jìn)行處理。用戶(hù)定義類(lèi)型異常情態(tài),需要程序員自己定義代碼,對(duì)異常情況進(jìn)行處理。例:Declaree_toomanystudentsexception;1e_toomanystudents的作用域和本塊的其他變量相同。預(yù)定義型異常情態(tài)預(yù)定義型異常情態(tài)可以直接使用,沒(méi)有必要聲明。Invalid_cursor:當(dāng)執(zhí)行非法的游標(biāo)操作時(shí),會(huì)引發(fā)這個(gè)錯(cuò)誤,如試圖關(guān)閉已關(guān)閉的游標(biāo)。Cursor_already_open:試圖打開(kāi)已經(jīng)打開(kāi)的游標(biāo),會(huì)引發(fā)這個(gè)錯(cuò)誤。No_data_found:當(dāng)selectinto語(yǔ)句沒(méi)有返回行時(shí),和引用沒(méi)有賦值過(guò)的pl/sql表的元素時(shí)會(huì)引發(fā)這個(gè)錯(cuò)誤。Too_may_rows:當(dāng)selectinto語(yǔ)句返回多個(gè)行時(shí),會(huì)引發(fā)這個(gè)錯(cuò)誤。Invalid_number:當(dāng)試圖從字符串轉(zhuǎn)換為數(shù)值失敗時(shí),會(huì)引發(fā)這個(gè)錯(cuò)誤,在過(guò)程性語(yǔ)句中會(huì)引發(fā)value_error錯(cuò)誤。如:下面的語(yǔ)句引發(fā)invalid_number錯(cuò)誤,因?yàn)椤畑’不是數(shù)值。Insertintostudents(id,first_name,last_name)values(‘x’,’scott’,’smith’);2Storage_error和program_error:是內(nèi)部的異常情態(tài),通常不會(huì)引發(fā)他們。Value_error:當(dāng)在過(guò)程性語(yǔ)句中發(fā)生了算術(shù)、轉(zhuǎn)換、截尾或限制性錯(cuò)誤時(shí)會(huì)引發(fā)這個(gè)情態(tài)。如果在sql語(yǔ)句中發(fā)生錯(cuò)誤,會(huì)引發(fā)invalid_number錯(cuò)誤。這個(gè)錯(cuò)誤可能是一條賦值語(yǔ)句或selectinto語(yǔ)句的執(zhí)行結(jié)果。下面的兩個(gè)例子都引發(fā)value_error錯(cuò)誤。Declarev_tempvarvarchar2(3);Beginv_tempvar:='ABCD';End;Declarev_tempvarnumber(2);Beginselectidintov_tempvarfromstudentswherelast_name='smith';End;3觸發(fā)異常情態(tài)當(dāng)預(yù)定義的異常情態(tài)錯(cuò)誤發(fā)生時(shí),就會(huì)觸發(fā)該異常情態(tài)。用戶(hù)定義的異常情態(tài)由raise語(yǔ)句觸發(fā)。例:Declaree_toomanystudentsexceptionv_currentstudentsnumber(3);v_maxstudentsnumber(3);Beginselectcurrent_students,max_studentsintov_currentstudents,v_maxstudentsfromclasseswheredepartment=‘HIS’andcourse=‘101’;4ifv_currentstudents>v_maxstudentsthenraisee_toomanystudentsEndif;End;當(dāng)引發(fā)異常情態(tài)時(shí),控制轉(zhuǎn)給該塊的異常處理部分。如果沒(méi)有異常處理部分,該異常處理部分將傳給包含該塊的塊。一旦將控制轉(zhuǎn)給異常處理部分,沒(méi)有辦法再將控制返回給該塊的執(zhí)行部分。處理異常情態(tài)異常部分的語(yǔ)法如下:Exceptionwhenexception_namethen處理錯(cuò)誤語(yǔ)句序列whenexception_namethen處理錯(cuò)誤語(yǔ)句序列whenothersthen處理錯(cuò)誤語(yǔ)句序列end;5一個(gè)處理器可以對(duì)多個(gè)異常情態(tài)進(jìn)行處理,用or連接例:Exceptionwhenno_data_foundortoo_many_rowstheninsertintolog_table(info)values(‘a(chǎn)selecterroroccurred’);End;Others異常處理器將對(duì)所有語(yǔ)法的異常情態(tài)進(jìn)行處理,一般放在異常處理的最后,可以保證所有的錯(cuò)誤都被檢測(cè)到。Declaree_toomanystudentsexceptionv_currentstudentsnumber(3);v_maxstudentsnumber(3);v_errorcodenumber;v_errortextvarchar2(200);Beginselectcurrent_students,max_studentsintov_currentstudents,v_maxstudentsfromclasseswheredepartment=‘HIS’andcourse=‘101’;6ifv_currentstudents>v_maxstudentsthenraisee_toomanystudentsEndif;Exceptionwhene_toomanystudentstheninsertintolog_table(info)values(‘history101has’||v_currentstudents||‘students:maxallowedis‘||v_maxstudents);whenothersthenv_errorcode:=sqlcode;v_errortext:=substr(sqlerrm,1,200);insertintolog_table(info)values(‘a(chǎn)nothererroroccurred’);end;*sqlcode和sqlerrm先被賦值給本地變量,然后這些變量在sql語(yǔ)句中被使用,sqlcode和sqlerrm不能直接在sql語(yǔ)句中使用,因?yàn)樗麄兪沁^(guò)程性的函數(shù)。sqlcode返回當(dāng)前的錯(cuò)誤號(hào),sqlerrm返回當(dāng)前的錯(cuò)誤信息正文。
7代碼消息使用的sqlerrm函數(shù)0ora-0000:normal,successfulcompletionsqlerrm(0)+100Ora-1403:nodatafoundsqlerrm(100)+10User-definedexceptionSqlerrm(10)nullora-0000:normal,successfulcompletionsqlerrm-1Ora-0001:uniqueconstraint(.)violatedSqlerrm(-1)-54Ora-00054:resourcebusyandacquirebynowaitspecifiedSqlerrm(-54)8Exception_init可以將一個(gè)經(jīng)過(guò)命名的異常情態(tài)與一個(gè)特別的oracle錯(cuò)誤相聯(lián)系。這樣可以用when撲獲此錯(cuò)誤,不用others撲獲。通過(guò)exception_initpragma實(shí)現(xiàn)的。其語(yǔ)法如下:Pragmaexception_init(exception_name,oracle_error_number)Pragma必須在聲明部分例:下面的例子在運(yùn)行時(shí)刻如遇到“ora-1400:mandatorynotnullcolumnmissingornullduringinsert”錯(cuò)誤時(shí),將引發(fā)e_missingnull異常情態(tài)。Declaree_missingnullexception;
pragmaexception_init(e_missingnull,-1400);Begininsertintostudents(id)values(null);Exceptionwhene_missingnulltheninsertintolog_table(info)values(‘ora-1400occurred’);End;9每次發(fā)發(fā)生pragmaexception_init時(shí),,一個(gè)個(gè)oracle錯(cuò)誤誤只能能和一一個(gè)用用戶(hù)定定義的的異常常情態(tài)態(tài)相關(guān)關(guān)聯(lián)。。在異異常處處理器器內(nèi)部部,sqlcode和sqlerrm將返返回發(fā)發(fā)生oracle錯(cuò)錯(cuò)誤的的代碼碼和錯(cuò)錯(cuò)誤信信息,,而不不會(huì)返返回用用戶(hù)定定義的的消息息。例:Declareex_hfyexception;Pragmaexception_init(ex_hfy,-1400);Begininsertintostudentsvalues(null);Exceptionwhenex_hfythendbms_output.put_line('不不能把把空值值插入入到非非空列列');End;注意,,這里里-1400不不能為為別的的,因因?yàn)榘寻芽罩抵挡迦肴氲椒欠强樟辛械腻e(cuò)錯(cuò)誤號(hào)號(hào)就是是這個(gè)個(gè)??煽梢詥螁为?dú)執(zhí)執(zhí)行insert語(yǔ)語(yǔ)句查查看錯(cuò)錯(cuò)誤號(hào)號(hào)。10使用raise_application_error可以用用raise_application_error創(chuàng)創(chuàng)建自自己的的錯(cuò)誤誤消息息,這這比命命名的的異常常情態(tài)態(tài)更具具有說(shuō)說(shuō)明性性。其其語(yǔ)法法如下下:Raise_application_error(error_number,error_message,[keep-errors]);這里error_number是是從--20,000到--20,999之間間的數(shù)數(shù),error_message是與與此錯(cuò)錯(cuò)誤相相關(guān)的的錯(cuò)誤誤正文文。Keep_errors為布布爾值值,如如果他他為true,,則新新的錯(cuò)錯(cuò)誤被被添加加到已已經(jīng)引引發(fā)的的錯(cuò)誤誤列表表中((如果果有的的話(huà)))。如如果為為false((為缺缺省值值),,則新新的錯(cuò)錯(cuò)誤將將替換換錯(cuò)誤誤的當(dāng)當(dāng)前列列表。。例::下面面的過(guò)過(guò)程為為一個(gè)個(gè)新的的學(xué)生生注冊(cè)冊(cè)以前前,檢檢查是是否在在班級(jí)級(jí)中有有足夠夠的地地方容容納他他。11Createorreplaceprocedureregister(p_studentidinstudents.id%type,p_departmentinclasses.department%type,p_courseinclasses.course%type)asv_currentstudentsnumber;v_maxstudentsnumber;Beginselectcurrent_students,max_studentsintov_currentstudent,v_maxstudentsfromclasseswheredepartment=p_departmentandcourse=p_course;12ifv_currentstudents+1>v_maxstudentsthenraise_application_error(-20000,‘can’’’taddmorestudentsto’’||p_department||‘‘‘‘||p_course);endif;classpackage.addstudent(p_studentid,p_department,p_course);Exceptionwhenno_data_foundthenraise_application_error(-20001,p_department||‘‘‘||p_course||‘‘doesn’’’texist!’);Endregister;以上程程序運(yùn)運(yùn)行時(shí)時(shí),當(dāng)當(dāng)沒(méi)有有足夠夠的空空間容容納新新的學(xué)學(xué)生時(shí)時(shí),返返回ora-20000:can’’taddmorestudentstohis101錯(cuò)誤誤消息息。13觸發(fā)器器綜述觸發(fā)器器可以以理解解為特特殊的的存儲(chǔ)儲(chǔ)過(guò)程程。當(dāng)當(dāng)應(yīng)用用程序序用一一條滿(mǎn)滿(mǎn)足觸觸發(fā)器器條件件的SQLDML語(yǔ)句句指向向與觸觸發(fā)器器相連連接的的表時(shí)時(shí),Oracle將將自動(dòng)動(dòng)執(zhí)行行該觸觸發(fā)器器以執(zhí)執(zhí)行任任務(wù)。。DML觸發(fā)發(fā)器,,定義義在對(duì)對(duì)數(shù)據(jù)據(jù)庫(kù)表表的操操縱行行為((insert,delete,update)上上的觸觸發(fā)器器。前觸發(fā)發(fā)器、、后觸觸發(fā)器器。語(yǔ)句觸觸發(fā)、、行觸觸發(fā)14觸發(fā)器器15觸發(fā)器器16觸發(fā)器器關(guān)于觸觸發(fā)器器中的的old和和new關(guān)關(guān)鍵字字:old表示示數(shù)據(jù)據(jù)操縱縱前的的值,,old只只對(duì)UPDATE和和DELETE操作作。new表示示數(shù)據(jù)據(jù)操縱縱后的的值,,new只只對(duì)UPDATE和和INSERT操作作。17觸發(fā)器器定義的的一般般語(yǔ)法法:CREATE[ORREPLACE]TRIGGERtrigger{BEFORE|AFTER}{DELETE|INSERT|UPDATE[OFcolumn[,column]……]}[OR{DELETE|INSERT|UPDATE[OFcolumn[,column]…]}]…ONtableFOREACHROW[WHENcondition]BEGIN…pl/sqlblock..END[trigger]18觸發(fā)發(fā)器器示示例例CREATEORREPLACETRIGGERlogempBEFOREINSERTORUPDATEORDELETEONempFOREACHROWDECLAREstatementtypeCHAR(20);BEGINIFINSERTINGTHENstatementtype:='INSERTTRIGGER!';ELSIFUPDATINGTHENst
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《TPS豐田生產(chǎn)方式》課件
- 決定銷(xiāo)售業(yè)績(jī)的重要心態(tài)(課件)
- LNG氣化站應(yīng)急備用氣源自用建設(shè)項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 一年級(jí)語(yǔ)文上冊(cè)拼音aoe
- 2024年江蘇省招聘社區(qū)工作者題庫(kù)及參考答案
- 單位管理制度收錄大合集【人員管理篇】十篇
- 單位管理制度品讀選集【職員管理】十篇
- 樓梯 欄桿 欄板(一)22J403-1
- 果凍袋行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 中國(guó)返利網(wǎng)站行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢(xún)報(bào)告
- 醫(yī)療設(shè)備維修和保養(yǎng)政府采購(gòu)合同(2024版)
- 公司總經(jīng)理2024年年終總結(jié)(31篇)
- 氣管切開(kāi)病人疑難病例討論
- 2024年氧化鋯陶瓷粉料行業(yè)營(yíng)銷(xiāo)策略方案
- (四下)語(yǔ)文教學(xué)課件-第五單元-單元解讀-部編版
- 國(guó)網(wǎng)企業(yè)文化培訓(xùn)
- 2024年云南省高三第二次高中畢業(yè)生復(fù)習(xí)統(tǒng)一檢測(cè)(二統(tǒng)) 理科綜合試卷(含答案)
- 【真題】2023年南京市中考語(yǔ)文試卷(含答案解析)
- 膀胱憩室護(hù)理查
- 《中藥鑒定技術(shù)》課件-金銀花的鑒定
- 2024山東能源集團(tuán)中級(jí)人才庫(kù)選拔高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論