Oracle中的異常處理與自定義異常方式
一、什么是異常處理
程序因為數(shù)據(jù)的原因或者入?yún)⒌脑颍瑢?dǎo)致程序出錯,這個時候,為了面對這種不可避免的問題,程序塊里面添加了異常處理,當程序異常的時候,該怎么辦,可以在異常中定義。
二、異常的兩種分類
(1) 系統(tǒng)預(yù)定義:Oracle 自動拋出(如:'違反唯一性約束')
(2) 用戶自定義:編碼人員認為的 '非正常情況' ( v_exp1 EXCEPTION)
其中 '用戶自定義' 的異常在 pl/sql 環(huán)境使用,需 '顯式拋出'。
三、常見的預(yù)定義異常
| 異常名稱 | 錯誤代碼 | 說明 |
|---|---|---|
| NO_DATA_FOUND | ORA-01403 | 查詢無結(jié)果 |
| TOO_MANY_ROWS | ORA-01422 | 查詢返回多行,而 INTO 只接收一行 |
| DUP_VAL_ON_INDEX | ORA-00001 | 違反唯一約束 |
| ZERO_DIVIDE | ORA-01476 | 除數(shù)為零 |
| INVALID_NUMBER | ORA-01722 | 字符串轉(zhuǎn)數(shù)字失敗 |
| TIMEOUT_ON_RESOURCE | ORA-00051 | 等待資源超時 |
四、異常處理語法
EXCEPTION
WHEN [OTHERS] -- 異常場景
THEN -- 則做的事情五、異常常用的三種方案
RAISE 異常拋出 --程序不接著往下執(zhí)行 NULL 忽略異常 ROLLBACK 異常回滾 --程序出現(xiàn)異常則回滾 程序的相關(guān)操作(UPDATE/INERT/DELETE)
捕捉異常的關(guān)鍵字是 SQLERRM 它能夠得到 異常的詳細信息
六、使用RAISE_APPLICATION_ERROR創(chuàng)建自定義錯誤碼
自定義異常參數(shù):使用RAISE_APPLICATION_ERROR拋出帶自定義錯誤碼和消息的異常。
開發(fā)者自定義的錯誤碼,范圍為-20000至-20999:
DECLARE
v_salary NUMBER := 100000;
BEGIN
IF v_salary > 50000 THEN
RAISE_APPLICATION_ERROR(-20001, '工資超出上限'); -- 自定義錯誤碼
END IF;
END;
七、異常練習(xí)
declare
v_num number := &input;
exp_date_range exception; -- 異常定義
begin
if v_num < 0 then
raise exp_date_range; -- 異常拋出
end if;
dbms_output.put_line(v_num);
exception
when exp_date_range then
dbms_output.put_line('數(shù)據(jù)范圍不能為負數(shù)!');
end;

捕捉異常信息:
示例:將EMP表的數(shù)據(jù)同步到EMP表(把EMP表的數(shù)據(jù)重復(fù)兩遍)
create or replace procedure p_16 is
begin
insert into emp
select * from emp;
commit;
exception
when others then
dbms_output.put_line(SQLERRM);
end;
BEGIN
p_16;
end;
示例:入?yún)T工編號,打印對應(yīng)員工的姓名
程序出現(xiàn)異常之后,忽略使用null;當出現(xiàn)異常的時候,讓程序跳出執(zhí)行 彈出一個報錯的框 即拋出異常
create or replace procedure p_17(p_empno number) is
v_name varchar2(10);
begin
select ename into v_name from emp where empno = p_empno;
dbms_output.put_line(v_name);
exception
when others then
dbms_output.put_line(SQLERRM);
null;
raise; -- 彈出窗口
-- rollback;-- 也可以進行回滾
-- 注意:raise語句會重新拋出當前異常,導(dǎo)致后續(xù)的 rollback; 永遠不會執(zhí)行
end;
BEGIN
p_17(p_empno=>1111);
end;
程序出現(xiàn)異常,則回滾
下面是一個匿名 PL/SQL 塊:
DECLARE
dept_no NUMBER(2) := 70;
BEGIN
--開始事務(wù)
INSERT INTO dept VALUES (70, '市場部', '北京'); --插入部門記錄
INSERT INTO dept VALUES (70, '后勤部', '上海'); --插入相同編號的部門記錄
INSERT INTO emp --插入員工記錄
VALUES
(7997, '威爾', '銷售人員', NULL, TRUNC(SYSDATE), 5000, 300, 70);
--提交事務(wù)
COMMIT;
EXCEPTION
WHEN OTHERS THEN
--捕捉異常
DBMS_OUTPUT.PUT_LINE(SQLERRM); --顯示異常消息
ROLLBACK; --回滾異常
END;因為dept表的主鍵插入重復(fù),所以捕捉到異常,數(shù)據(jù)回滾,
插入emp表的語句在插入dept表之后,dept表未插入成功,emp表的語句不會跑,因此兩張表都插入失敗
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫"記錄被另一個用戶鎖住"解決方法(推薦)
數(shù)據(jù)庫是一個多用戶使用的共享資源。當多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況。這篇文章主要介紹了Oracle數(shù)據(jù)庫"記錄被另一個用戶鎖住"解決方法2018-03-03
Oracle數(shù)據(jù)庫中SQL語句的優(yōu)化技巧
這篇文章主要介紹了Oracle數(shù)據(jù)庫中SQL語句的優(yōu)化技巧的相關(guān)資料,需要的朋友可以參考下2016-07-07
六分鐘學(xué)會創(chuàng)建Oracle表空間的實現(xiàn)步驟
這里介紹創(chuàng)建Oracle表空間的步驟,首先查詢空閑空間、增加Oracle表空間、修改文件大小語句如下、創(chuàng)建Oracle表空間,最后更改自動擴展屬性2013-06-06

