Oracle--plsql異常處理

來源:互聯網
上載者:User

•什麼是異常?
Oracle中出現錯誤的情形通常分為編譯時間錯誤(compile-timeerror)和執行階段錯誤(run-time error),異常是在PL/SQL執行過程中出現的警告或錯誤。
•異常是如何觸發的?–發生了一個 Oracle 錯誤時–使用RAISE語句顯式觸發
•如何處理異常?–用處理機截獲–在調用環境中傳播異常

兩種觸發異常方法:

發生了 Oracle 錯誤,就會自動觸發相關的異常。

可以在塊中使用RAISE語句顯式的觸發異常。被觸發的異常可以是預定義的異常,也可以是自訂的異常。




截獲異常

如果在塊的執行部分異常被觸發,當前的塊就會轉去執行異常處理部分的相應異常處理機。如果PL/SQL成功處理了異常,就不會把異常傳播給外部塊或環境,從而,PL/SQL塊正常結束。

異常的傳播

如果在塊的執行部分異常被觸發, 然而沒有相應的異常處理機,塊就會異常終止,而將異常傳遞給調用環境。

錯誤引發異常,每當引發異常時,都將控制權傳遞給例外處理常式,例外處理常式處理異常.


捕獲異常:

  1. EXCEPTION  
  2.   WHEN exception1 [OR exception2 . . .] THEN  
  3.     statement1;  
  4.     statement2;  
  5.     . . .  
  6.   [WHEN exception3 [OR exception4 . . .] THEN  
  7.     statement1;  
  8.     statement2;  
  9.     . . .]  
  10.   [WHEN OTHERS THEN  
  11.     statement1;  
  12.     statement2;  
  13.     . . .]  

•在異常部分WHEN 子句沒有數量限制•WHEN OTHERS 是最後一個子句•異常處理部分從關鍵字EXCEPTION開始•當異常拋出後,控制無條件轉到異常處理部分•在離開塊之前只能執行一種異常處理
預定義異常:

預定義異常是由 Oracle 為常見錯誤預先定義的,不需要顯式聲明。

在相應的異常處理常式中引用錯誤的標準名來截獲一個Oracle 伺服器預定義錯誤。


例子:

  1. DECLARE  
  2.     v_sal       emp.sal%type;  
  3. BEGIN  
  4.     SELECT  sal  INTO v_sal   
  5.     FROM emp  
  6.     WHERE empno=999;  
  7. EXCEPTION  
  8.     WHEN NO_DATA_FOUND then  
  9.         dbms_output.put_line('沒有查到資料');  
  10.     WHEN others then  
  11.         dbms_output.put_line('其它異常');  
  12. END;  

要截獲Oracle伺服器沒有預定義的錯誤,需先聲明這個錯誤或者使用OTHERS處理機。 


非預定義異常:

1.  在聲明部分聲明異常名。

    文法:

    exception      EXCEPTION;

    其中:  exception  異常名

2.  使用PRAGMAEXCEPTION_INIT語句將異常處理名字和Oracle的錯誤碼關聯起來.

   文法:

   PRAGMA   EXCEPTION_INIT ( exception, error_number ) ;

    其中:  exception  先前聲明的異常名

   error_number  標準Oracle 錯誤碼

3.  在相應的異常處理常式中引用已聲明的異常。


關鍵字 PRAGMA (偽指令pseudoinstructions)表示語句是一個編譯指令,在執行PL/SQL塊時並不處理該語句。在PL/SQL塊中,一個編譯指令EXCEPTION_INIT告訴編譯器將一個異常處理的名字和一個Oracle錯誤碼聯絡起來。

  1. DECLARE  
  2.      e_emp_cons     EXCEPTION;  
  3.     PRAGMA EXCEPTION_INIT(e_emp_cons,-00001);  
  4. BEGIN  
  5.     INSERT INTO emp    
  6.         SELECT * FROM emp;  
  7. EXCEPTION  
  8.     WHEN e_emp_cons   THEN  
  9.        dbms_output.put_line('違反唯一性限制式');  
  10. END;  

捕獲異常的函數:

•SQLCODE

  返回Oracle的錯誤碼

•SQLERRM

  返回和錯誤值相關聯的資訊

SQLCODE值  說明

  0      沒有異常   

  100      NO_DATA_FOUND異常

  負數      其它Oracle錯誤號碼


自訂異常:

在PL/SQL塊的聲明部分聲明。

使用RAISE語句顯式地發布 。


異常的傳遞;

當子塊自己處理異常時,它可以正常終止,並且在子塊的END語句之後可以立即將控制交給外部塊。

然而,如果 PL/SQL出現了異常,但當前塊中沒有針對該異常的處理機,就會尋找外部塊中有沒有處理機,如果所有的外部塊都不能處理這個異常,則就會在宿主環境中出現未處理的例外狀況。

當把異常傳播給外部塊,則當前塊中的等待執行代碼都不再被執行。

這種方法的優點就是內部塊僅處理自己特有的錯誤,而將一般的異常處理留給外部塊。

Raise_Application_Error過程
–用於建立使用者定義的錯誤訊息的過程–向使用者返回錯誤,並且其返回格式和其它Oracle錯誤的格式相同–既可以在可執行部分中使用,也可以在異常部分中使用

  Raise_Application_Error(error_number,message);

–錯誤編號必須介於 –20000 和 –20999 之間–錯誤訊息的長度可長達 2048 個位元組

利用過程 RAISE_APPLICATION_ERRO返回一個非標準的錯誤碼和錯誤訊息,從而可以和預定義異常進行互動。使用RAISE_APPLICATION_ERROR就可以嚮應用程式報告錯誤訊息,並且避免了返回沒有處理過的異常。

  1. 執列區域:  
  2.     BEGIN  
  3.         …  
  4.         delete from emp where demtno=10;  
  5.         if SQL%NOTFOUND then  
  6.              Raise_Application_Error(-20202,  
  7.                 ’this is not a valid department’);  
  8.         end if;  
  9.         …  
  10. 異常地區:  
  11.     EXCEPTION  
  12.         when NO_DATA_FOUND then  
  13.              Raise_Application_Error(-20202,  
  14.                 ’this is not a valid department’);    
  15.     END;  

更多Oracle相關資訊見Oracle 專題頁面 http://www.bkjia.com/topicnews.aspx?tid=12

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.