1. 程式人生 > >Oracle 學習筆記第九天

Oracle 學習筆記第九天

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;
  1. 使用者定義異常

    有些情況可能是正常執行,但是在需求上需要我們將其設為異常,這時候就需要用到自定義異常了。

    比如說有些時候我們查詢的值符合規範,但是在資料庫中沒有值,這時候返回給我們的為空(不為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系統用的,具體還是得看官方文件,暫時還沒搞清是多少。