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