oracle異常及觸發(fā)器_第1頁(yè)
oracle異常及觸發(fā)器_第2頁(yè)
oracle異常及觸發(fā)器_第3頁(yè)
oracle異常及觸發(fā)器_第4頁(yè)
oracle異常及觸發(fā)器_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論