1. 程式人生 > 其它 >Oracle 異常詳解(exception)

Oracle 異常詳解(exception)

Oracle 異常詳解(exception)

來源:(33條訊息) Oracle 異常詳解(exception)_魚丸丶粗麵-CSDN部落格

魚丸丶粗麵 2018-10-08 23:03:23 2949 收藏 14
分類專欄: Oracle PL/SQL 文章標籤: Oracle 異常 exception raise
版權

Oracle
同時被 2 個專欄收錄
110 篇文章10 訂閱
訂閱專欄

PL/SQL
17 篇文章1 訂閱
訂閱專欄
文章目錄
1 概述
1.1 思維導圖
1.2 語法
2 異常分類
2.1 系統預定義
2.2 使用者自定義
3 異常丟擲
3.1 raise
3.2 raise_application_error
4 重寫異常
1 概述
1. 概念
(1) 程式一旦發生異常而沒有處理時,程式會 '自動終止'
(2) 反之,則跳轉至 '最近一個 exception' 進行處理
1
2
3
1.1 思維導圖


1.2 語法
1. 異常處理可以按任意次序排列,但 'others' 必須放在最後
2. 異常會被離它 '最近的一個 exception 塊' 捕獲到
(1) 若異常被 <異常1> 捕獲到,那麼該異常到此結束(不會繼續判斷 <異常2> 及其後面的)

如:
declare
begin
程式程式碼塊;
exception
when <異常1> then
異常語句1;
when <異常2> then
異常語句2;
when others then
其它異常;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
例子:(除數不能為 0)

DECLARE
v_num NUMBER(5) := 5;
BEGIN
BEGIN
v_num := v_num / 0;
EXCEPTION
-- 如果此處無 exception,則拋向最近一個 exception
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE); -- 異常編號
dbms_output.put_line(SQLERRM); -- 異常描述資訊
dbms_output.put_line(dbms_utility.format_error_backtrace); -- 異常發生的位置
dbms_output.put_line(dbms_utility.format_call_stack); -- 異常堆疊
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('若沒有上面的 exception 程式碼塊,異常才會被此處捕獲');
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2 異常分類
1. 異常的兩種分類
(1) 系統預定義:Oracle 自動丟擲(如:'違反唯一性約束')
(2) 使用者自定義:編碼人員認為的 '非正常情況'

2. 其中 '使用者自定義' 的異常在 pl/sql 環境使用,需 '顯示丟擲'
1
2
3
4
5
基礎資料準備:

create table stu_info(
sno number(3) constraint pk_stu_info_sno primary key,
sname varchar2(30)
);
1
2
3
4
2.1 系統預定義
insert into stu_info(sno, sname) values(1, '瑤瑤');
insert into stu_info(sno, sname) values(1, '優優');
1
2
報錯截圖:(ORA-00001: 違反唯一約束條件)


2.2 使用者自定義

declare
v_num number(5) := -1;
exp_data_range exception; -- 異常定義
begin
if v_num < 0 then
raise exp_data_range; -- 異常丟擲
end if;
exception
when exp_data_range then
dbms_output.put_line('資料範圍不能為負數!');
end;
1
2
3
4
5
6
7
8
9
10
11
測試結果:

資料範圍不能為負數!
1
3 異常丟擲
1. raise:異常丟擲並在 pl/sql exception 塊中處理

2. raise_application_error:異常丟擲給 '應用程式',pl/sql 中並不處理!
1
2
3
3.1 raise
上述提到的就有:2.2 使用者自定義
3.2 raise_application_error
raise_application_error(error_number, error_message, error_boolean);
error_number : 取值範圍: -20000 到 -20999 之間
error_message :相應的提示資訊(< 2048 位元組),超出則擷取。
error_boolean : 可選項,若為 true: 則新錯誤將被新增到已經引發的錯誤列表中。
若為 false(預設):則覆蓋。
1
2
3
4
5
例1:false(預設,覆蓋異常資訊,若有)

declare
v_num number(5) := -1;
begin
if v_num < 0 then
raise_application_error(-20001, '不能為負數!'); -- 異常丟擲
end if;
end;
1
2
3
4
5
6
7
異常丟擲截圖:


例2:true(追加異常資訊)

declare
v_num number(5) := -1;
begin
begin
if v_num < 0 then
raise_application_error(-20001, '不能為負數!'); -- 異常丟擲
end if;
exception
when others then
raise_application_error(-20001, 'true:追加異常資訊', true); -- 異常丟擲
end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
異常丟擲截圖:


4 重寫異常
1. 異常均可被重寫
(1) 系統預定義
(2) 使用者自定義
1
2
3
示例:重寫系統預定義異常:ORA-01476: 除數為 0

declare
exp_divisor_of_zero_rewrite exception;
pragma exception_init(exp_divisor_of_zero_rewrite, -1476);
v_num number(1) := 3;
begin
v_num := v_num / 0;
exception
when exp_divisor_of_zero_rewrite then
raise_application_error(-20001, '除數不能為 0(重寫異常)');
end;
1
2
3
4
5
6
7
8
9
10
異常丟擲截圖:

————————————————
版權宣告:本文為CSDN博主「魚丸丶粗麵」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_34745941/article/details/82846820