Oracle 學習筆記第九天
阿新 • • 發佈:2018-12-23
Oracle 學習筆記第九天
異常
概念:在執行程式時出現的錯誤叫做異常
發生異常後,語句將停止執行,控制權轉移到 PL/SQL 塊的異常處理部分。
分類:
1. 預定義異常
-- 語法: BEGIN sequence_of_statements; EXCEPTION WHEN <exception_name> THEN sequence_of_statements; WHEN OTHERS THEN sequence_of_statements; END;
-- 舉例:
BEGIN
update teacher t set t.comm=100/0;
EXCEPTION
WHEN ZERO_DIVIDE THEN dbms_output.put_line('除數為0');
WHEN OTHERS THEN dbms_output.put_line('其他異常');
END;
-
使用者定義異常
有些情況可能是正常執行,但是在需求上需要我們將其設為異常,這時候就需要用到自定義異常了。
比如說有些時候我們查詢的值符合規範,但是在資料庫中沒有值,這時候返回給我們的為空(不為null,為‘ ’),但是這時候卻不想顯示空,可以寫一個自定義異常,顯示一些我們想要輸出的提示內容。
首先我們需要在宣告部分定義異常,然後在異常塊裡面丟擲異常,然後在處理異常。
-- 語法 -- 宣告異常 DACLARE e_exceptionName EXCEPTION; -- 丟擲異常 BEGIN RAISE e_exceptionName ; -- 處理異常 -- 這部分寫你想要怎麼處理的邏輯。
繫結異常編號
我們通過PLSQL執行後爆出的異常一般可以看到異常編碼,但是我們不知道用什麼名稱將有些特殊的系統異常放在異常處理中,這個時候我們可以定義異常,然後繫結異常編號,通過這樣來達到處理這些異常的目的,比如:
前面的ORA-xxxxx就是異常編碼,定義異常變數,然後繫結這個異常編碼,再在異常處理中處理。
-- 語法:
declare
--定義異常變數
v_exception exception;
--將異常變數繫結到某個特殊的錯誤碼
pragma exception_init(v_exception,-2291);
-- 舉例:
set serveroutput on;
declare
v_empno emp.empno%type := &工號;
--定義異常變數
v_exception exception;
--將異常變數繫結到某個特殊的錯誤碼
pragma exception_init(v_exception,-2291);
begin
update emp e
set e.deptno = 99
where e.empno = v_empno;
exception
when v_exception then
dbms_output.put_line('新的部門編號在部門表中不存在');
end;
/
丟擲異常
和java一樣,異常我們可以處理,也可以丟擲,同樣,丟擲的異常有上一級呼叫者處理。
-- 語法
-- 在begin中判斷後
raise_application_error(自己定義的異常編號,自己定義的輸出的異常資訊);
set serveroutput on;
declare
v_deptno emp.deptno%type := &部門編號;
v_sum number(10,2);
begin
select sum(e.sal) into v_sum
from emp e
where e.deptno = v_deptno;
--如果總工資為空則拋異常
if v_sum is null then
--丟擲異常
raise_application_error(-20001,'你輸入的部門沒有員工');
end if;
dbms_output.put_line('該部門的總工資為:'||v_sum);
end;
/
Oracle自定義的錯誤碼是有取值範圍的,貌似小於20000的值不能選,這個是Oracle系統用的,具體還是得看官方文件,暫時還沒搞清是多少。