前幾天看《Oracle PL/SQL Programming》的異常處理部分 粗粗看了一遍 覺得有點(diǎn)亂 根據(jù)自己的理解作了一下分類 并相應(yīng)給了一些簡(jiǎn)例 不一定很準(zhǔn)確 供參考

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、潁東網(wǎng)站維護(hù)、網(wǎng)站推廣。
Oracle 異常
具名 Oracle 異常
Oracle 為此類異常預(yù)先指定了異常號(hào) 異常信息 異常名稱
匿名 Oracle 異常
Oracle 為此類異常預(yù)先指定了異常號(hào) 異常信息 但未指定異常名稱
自定義異常
普通自定義異常
與 Oracle 無關(guān)的業(yè)務(wù)邏輯異常 無異常號(hào) 異常信息 異常名稱需要手工聲明
應(yīng)用程序異常 ( Raise_Application_Error )
與 Oracle 無關(guān)的業(yè)務(wù)邏輯異常 此方法拋出的異常可以自定義異常號(hào)及異常信息 可以通過 Exception_Init 綁定到手工聲明的異常名稱上
)Oracle異常
Oracle異常總是由Oracle檢測(cè)并自動(dòng)拋出的
)具名Oracle異常
Oracle定義了 個(gè)具名的Oracle異常 比如
Dup_val_on_index(ora )當(dāng)中唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)
No_data_found(ora )執(zhí)行select into未返回行 或者引用了索引表未初始化的元素時(shí)
流程
A)在Exception模塊按異常名進(jìn)行處理
示例
DECLARE
num number;
BEGIN
num:= / ;
EXCEPTION
when ZERO_DIVIDE then
dbms_output put_line(SQLERRM);
END;
/
ORA : divisor is equal to zero
PL/SQL procedure successfully pleted
)匿名Oracle異常
Oracle中存在大量匿名的異常 比如
ORA : parent key not found
由于PL/SQL的異常處理模塊只接受異常名稱 不接受異常號(hào)(除了WHEN OTHERS語(yǔ)句 它可以捕獲任意異常 不論你是否具有異常名稱) 為便于處理 需要手工為其指定異常名稱
流程
A)聲明異常
B)將此異常綁定到Oracle異常號(hào)上
C)在Exception模塊按異常名進(jìn)行處理
示例
DECLARE
ex EXCEPTION;
PRAGMA EXCEPTION_INIT(ex );
BEGIN
insert into t values( );
EXCEPTION
when ex then
dbms_output put_line(SQLERRM);
END;
/
ORA : integrity constraint (ADMIN FK ) violated parent key not found
PL/SQL procedure successfully pleted
)自定義異常
自定義異常總是開發(fā)者顯式拋出來的
)普通自定義異常
流程
A)聲明異常
B)使用Raise語(yǔ)句拋出異常
C)在Exception模塊按異常名進(jìn)行處理
示例
DECLARE
ex EXCEPTION;
BEGIN
RAISE ex;
EXCEPTION
when ex then
dbms_output put_line(SQLERRM);
dbms_output put_line( i raised a user defined exception ex );
END;
/
User Defined Exception
i raised a user defined exception ex
)應(yīng)用程序異常Raise_Application_Error(Num Msg)
普通自定義異常既沒有異常號(hào)(SQLCODE一律為 ) 也不能指定異常信息(SQLERRM一律為 User Defined Exception ) 如果想要為自定義異常指定異常號(hào)與異常信息 需要借助Raise_Application_Error(Num Msg)函數(shù) 這里的Num即異常號(hào) 范圍是[ ] Msg則是異常信息
對(duì)于此類異常 由于Num是自定義的 因此應(yīng)該有相應(yīng)的管理辦法以避免重復(fù)使用異常號(hào) 比如可以將已使用的異常號(hào)保存在一張數(shù)據(jù)庫(kù)中表 以便將來檢查
流程
A)聲明異常
B)將此異常綁定到自定義的異常號(hào)上
C)使用Raise_Application_Error(Num Msg)拋出異常 同時(shí)指定了異常號(hào)及異常信息
D)在Exception模塊按異常名進(jìn)行處理
示例
CREATE OR REPLACE PROCEDURE mtest
is
ex EXCEPTION;
PRAGMA EXCEPTION_INIT(ex );
BEGIN
Raise_Application_Error( raising my exception );
EXCEPTION
when ex then
dbms_output put_line(SQLERRM);
END;
/
Procedure created
SQL exec mtest
ORA : raising my exception
lishixinzhi/Article/program/Oracle/201311/18175
如果用自定義異常則可以創(chuàng)建如下代碼
Sql代碼
declare
row_count int;
begin
select count(*) into row_count from tree_table where parent_id = '0001' ;
if (row_count 0) then
RAISE_APPLICATION_ERROR(-20001, '該節(jié)點(diǎn)有子節(jié)點(diǎn),不能被刪除。');
end if;
select count(*) into row_count from tree_table where id = '0001' and status 1 ;
if (row_count 0) then
RAISE_APPLICATION_ERROR(-20002, '該節(jié)點(diǎn)已被確認(rèn),不能被刪除。');
end if;
delete from tree_table where id = '0001';
end;
--設(shè):要拋出的異常叫做ex_no_data,要判斷是否小于0的變量為:v_data,則:
DECLARE
--聲明異常
ex_no_data EXCEPTION; -- Exception to indicate an error condition
v_data NUMBER; -- Variable to hold data
--v_ErrorCode NUMBER; -- Variable to hold the error message code
--v_ErrorText VARCHAR2(200); -- Variable to hold the error message text
BEGIN
--拋出異常
IF v_data 0 THEN --(括號(hào)內(nèi)填拋出異常的條件)
RAISE ex_no_data;
END IF;
--捕捉異常
EXCEPTION
WHEN ex_no_data THEN
dbms_output.put_line(v_data);
--捕捉其他異常,并獲得 捕獲異常的內(nèi)容
WHEN OTHERS THEN
null;
-- v_ErrorCode := SQLCODE;
-- v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- 注意這里用SUBSTR 來截取錯(cuò)誤消息
--dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/
---另可參考我之前的一個(gè)帖子:
當(dāng)與一個(gè)異常錯(cuò)誤相關(guān)的錯(cuò)誤出現(xiàn)時(shí),就會(huì)隱含觸發(fā)該異常錯(cuò)誤。用戶定義的異常錯(cuò)誤是通過顯式使用?RAISE?語(yǔ)句來觸發(fā)。當(dāng)引發(fā)一個(gè)異常錯(cuò)誤時(shí),控制就轉(zhuǎn)向到?EXCEPTION塊異常錯(cuò)誤部分,執(zhí)行錯(cuò)誤處理代碼。
對(duì)于這類異常情況的處理,步驟如下:
1、在PL/SQL?塊的定義部分定義異常情況:
異常情況??EXCEPTION;
2、RAISE?異常情況;
3、在PL/SQL?塊的異常情況處理部分對(duì)異常情況做出相應(yīng)的處理。
例:更新指定員工工資,增加100;
DECLARE
v_empno?employees.employee_id%TYPE?:=empno;
no_result??EXCEPTION;
BEGIN
UPDATE?employees?SET?salary?=?salary+100?WHERE?employee_id?=?v_empno;
IF?SQL%NOTFOUND?THEN
RAISE?no_result;
END?IF;
EXCEPTION
WHEN?no_result?THEN?
DBMS_OUTPUT.PUT_LINE('數(shù)據(jù)更新語(yǔ)句失敗了!');
WHEN?OTHERS?THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
1、彈出錯(cuò)誤框:
示例代碼:
declare
v_count number;
begin
select count(*) into v_count from dept;
if v_count 10 then
raise_application_error(-20001,'數(shù)量小于10');
end if;
end;
執(zhí)行結(jié)果:
2、控制臺(tái)顯示:
示例代碼:
declare
v_count number;
my_exp exception;
begin
select count(*) into v_count from dept;
if v_count 10 then
raise my_exp;
end if;
exception
when my_exp then
dbms_output.put_line('數(shù)量小于10');
when others then
dbms_output.put_line('其他異常');
end;
執(zhí)行結(jié)果:
PS:ORACLE 用戶自定義異常小例子:
CREATE OR REPLACE PROCEDURE test_Exception_byLeejin
(
ParameterA IN varchar,
ParameterB IN varchar,
ErrorCode OUT varchar --返回值,錯(cuò)誤編碼
)
AS
/*以下是一些變量的定義*/
V NUMBER;
V nvarchar();
V NUMBER;
APP_EXP EXCEPTION; --自定義異常
BEGIN
ErrorCode :='';
IF (ParameterA=ParameterB) THEN
ErrorCode := 'ParameterA = ParameterB';
RAISE APP_EXP; -- 拋出異常
END IF;
EXCEPTION
WHEN APP_EXP THEN --在處理異常
RAISE_APPLICATION_ERROR(-,ErrorCode);
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-,'未知異常');
END;
分享題目:oracle怎么創(chuàng)建異常 oracle自定義異常處理
分享URL:http://chinadenli.net/article16/hgpgdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、Google、用戶體驗(yàn)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)