![oracle異常及觸發(fā)器_第1頁(yè)](http://file4.renrendoc.com/view/c809c9f1264039c05c481b40409bd2c9/c809c9f1264039c05c481b40409bd2c91.gif)
![oracle異常及觸發(fā)器_第2頁(yè)](http://file4.renrendoc.com/view/c809c9f1264039c05c481b40409bd2c9/c809c9f1264039c05c481b40409bd2c92.gif)
![oracle異常及觸發(fā)器_第3頁(yè)](http://file4.renrendoc.com/view/c809c9f1264039c05c481b40409bd2c9/c809c9f1264039c05c481b40409bd2c93.gif)
![oracle異常及觸發(fā)器_第4頁(yè)](http://file4.renrendoc.com/view/c809c9f1264039c05c481b40409bd2c9/c809c9f1264039c05c481b40409bd2c94.gif)
![oracle異常及觸發(fā)器_第5頁(yè)](http://file4.renrendoc.com/view/c809c9f1264039c05c481b40409bd2c9/c809c9f1264039c05c481b40409bd2c95.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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ù)定義異常和用戶自定義異常。聲明異常情態(tài)異常情態(tài)在塊的聲明部分進(jìn)行聲明,在塊的執(zhí)行部分進(jìn)行觸發(fā),在塊的異常部分進(jìn)行處理。用戶定義類型異常情態(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)。用戶定義的異常情態(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è)用用戶定定義的的異常常情態(tài)態(tài)相關(guān)關(guān)聯(lián)。。在異異常處處理器器內(nèi)部部,sqlcode和sqlerrm將返返回發(fā)發(fā)生oracle錯(cuò)錯(cuò)誤的的代碼碼和錯(cuò)錯(cuò)誤信信息,,而不不會(huì)返返回用用戶定定義的的消息息。例: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ò)誤誤列表表中((如果果有的的話))。如如果為為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)用用程序序用一一條滿滿足觸觸發(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)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 燃?xì)獍l(fā)電機(jī)組項(xiàng)目績(jī)效評(píng)估報(bào)告
- 2025年汽車融資合同
- 2025年鮑爾環(huán)項(xiàng)目投資可行性研究分析報(bào)告
- 2025年中國(guó)音樂(lè)廳行業(yè)市場(chǎng)深度評(píng)估及投資策略咨詢報(bào)告
- 美術(shù)館展覽合作合同
- 網(wǎng)絡(luò)安全服務(wù)合作合同協(xié)議
- 2025年中國(guó)環(huán)境保護(hù)專用設(shè)備行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略研究報(bào)告
- 高中低鉻鑄球鍛項(xiàng)目可行性研究報(bào)告
- 體育賽事組織與策劃服務(wù)合同
- 2019-2025年中國(guó)水蛭行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y方向研究報(bào)告
- GB/T 22482-2008水文情報(bào)預(yù)報(bào)規(guī)范
- 蔬菜采購(gòu)項(xiàng)目投標(biāo)書
- 肩周炎康復(fù)護(hù)理
- 2022年安徽管子文化旅游集團(tuán)有限公司招聘筆試試題及答案解析
- SAPPM設(shè)備管理解決方案
- Q-HN-1-0000.08.004《風(fēng)力發(fā)電場(chǎng)電能質(zhì)量監(jiān)督技術(shù)標(biāo)準(zhǔn)》
- 宗教與社會(huì)課件
- 3人-機(jī)-環(huán)-管理本質(zhì)安全化措施課件
- 生殖醫(yī)學(xué)中心建設(shè)驗(yàn)收標(biāo)準(zhǔn)分析-講座課件PPT
- 慶陽(yáng)煤炭資源開(kāi)發(fā)調(diào)研報(bào)告
- 橋博常見(jiàn)問(wèn)題
評(píng)論
0/150
提交評(píng)論