ORACLE PL/SQL中異常處理全面分析
PL/SQL異常處理是PL/SQL塊中對(duì)執(zhí)行部分出現(xiàn)異常進(jìn)行處理的部分。PL/SQL采用的是統(tǒng)一異常處理機(jī)制,當(dāng)異常發(fā)生時(shí),程序會(huì)自動(dòng)跳轉(zhuǎn)到異常處理部分,交給異常處理程序進(jìn)行異常匹配,再調(diào)用對(duì)應(yīng)的處理方法。如果程序出現(xiàn)異常,而沒有找到對(duì)應(yīng)的異常處理程序,則程序會(huì)直接中斷拋出異常。PL/SQL異??梢苑譃轭A(yù)定義異常、非預(yù)定義異常、自定義異常三種。
PL/SQL異常處理都在PL/SQL塊的最下方,以EXCEPTION開始,其語句結(jié)構(gòu)如下:
declare
--聲明部分
begin
--執(zhí)行部分
exception
--異常部分
when exception1 then
--異常1處理程序
[when exception2 then
--異常2處理程序 ]
[when others then
--其它異常處理程序 ]
end;
語法解析:
1、exception是異常處理部分開始的標(biāo)志。
2、when后面是跟著異常的名稱, then后面是對(duì)應(yīng)異常處理程序。也就是當(dāng)異常exception1出現(xiàn)時(shí),執(zhí)行的是異常1處理程序。其它異常程序不會(huì)進(jìn)入。
3、when others then 指的是異常再前面異常捕獲中未捕獲到對(duì)應(yīng)的異常處理程序,則全部進(jìn)入其它異常處理程序進(jìn)行異常處理。
預(yù)定義異常Oracle數(shù)據(jù)庫(kù)為我們預(yù)定義好開發(fā)過程當(dāng)中經(jīng)常出現(xiàn)的異常名稱。Oracle一共提供了25種預(yù)定義異常名稱,常用到的如我們使用select ...into語句進(jìn)行賦值時(shí),經(jīng)常出現(xiàn)的NO_DATA_FOUND(select查詢時(shí)無數(shù)據(jù)不能賦值給變量錯(cuò)誤)、TOO_MANY_ROWS(查詢返回記錄不止一條,觸發(fā)的錯(cuò)誤)等。25種預(yù)定義異常,可以通過數(shù)據(jù)庫(kù)語句查詢,命令如下:
select * from dba_source t where t.TEXT like '%EXCEPTION_INIT%' AND NAME='STANDARD';
結(jié)果如下:
案例1、測(cè)試預(yù)定義異常,代碼如下:
declare
ls_stuinfo stuinfo%rowtype;
begin
select t.* into ls_stuinfo
from stuinfo t
where t.stuid='SC2018010061';
--該學(xué)號(hào)找不到對(duì)應(yīng)的學(xué)生
exception
when no_data_found then
dbms_output.put_line('該學(xué)生在學(xué)生信息表中找不到');
end;
結(jié)果如下:
Oracle當(dāng)中除了上面存在的25種預(yù)定義異常,更多存在的是非預(yù)定義的異常。也就是說,它們只存在錯(cuò)誤編號(hào)和對(duì)應(yīng)的錯(cuò)誤信息,但是沒有具體的錯(cuò)誤名稱的對(duì)應(yīng)。雖然,Oracle數(shù)據(jù)庫(kù)自己預(yù)定義了25種常見異常,但是對(duì)于其他異常,你可以選擇為異常添加一個(gè)名稱,使得它能夠被異常處理模塊進(jìn)行捕獲并拋出處理。
定義非預(yù)定義異常,可以分為兩步走:
1、進(jìn)行異常聲明:聲明一個(gè)異常名稱。
2、進(jìn)行異常名稱和錯(cuò)誤編號(hào)關(guān)聯(lián)。
Oracle處理非預(yù)定義的異常和預(yù)定義異常的原理是一致的,非預(yù)定義異常只是自己給對(duì)應(yīng)的Oracle錯(cuò)誤編號(hào)起個(gè)自己的名字,而預(yù)定義異常是Oracle數(shù)據(jù)自己起的名字。
案例2、演示非預(yù)定義異常的編寫,代碼如下:
declare
ex_only exception;--聲明一個(gè)異常名稱
PRAGMA EXCEPTION_INIT(ex_only,-00001);--主鍵唯一性錯(cuò)誤
begin
update stuinfo t set t.stuid='SC201801005'
where t.stuid='SC201801006';
exception
--捕獲異常
when ex_only then
dbms_output.put_line('該學(xué)號(hào)已經(jīng)存在,不應(yīng)許修改');
when others then
dbms_output.put_line(sqlerrm);
end;
結(jié)果如下:
除了,上面的預(yù)定義異常外,Oracle還為開發(fā)者提供一個(gè)異常處理方式,那就是自定義異常,可以根據(jù)自己實(shí)際的業(yè)務(wù)需求和邏輯錯(cuò)誤進(jìn)行自定義異常,并通過邏輯控制主動(dòng)拋出自定義異常交給對(duì)應(yīng)的異常處理模塊,進(jìn)行異常處理。進(jìn)行自定義異常的步驟如下:
1、異常聲明定義:在PL/SQL塊的聲明部分采用關(guān)鍵字EXCEPTION定義異常名稱。
2、異常主動(dòng)拋出:在PL/SQL塊中執(zhí)行部分,通過邏輯控制,主動(dòng)使用RAISE關(guān)鍵字拋出異常,交給異常處理模塊處理。
案例3、自定義異常演示,代碼如下:
declare
ex_check_sex exception;--聲明一個(gè)異常名稱
ls_sex stuinfo.sex%type;
begin
select t.sex into ls_sex from stuinfo t where t.stuid = 'SC201801006';
dbms_output.put_line('該學(xué)生的性別是:'||ls_sex);--1:男,2:女
if ls_sex not in ('1','2') then
--性別不是1或者2主動(dòng)拋出異常
raise ex_check_sex;
end if;
exception
--捕獲異常
when ex_check_sex then
dbms_output.put_line('性別只能是男或者女');
when others then
dbms_output.put_line(sqlerrm);
end;
結(jié)果如下:
下一篇:oracle RAC