Oracle plsql異常處理

2021-08-14 13:36:30 字數 3546 閱讀 9059

oracle中出現錯誤的情形通常分為編譯時錯誤(compile-timeerror)和執行時錯誤(run-time error),異常是在pl/sql執行過程中出現的警告或錯誤。

•異常是如何觸發的?

–發生了乙個 oracle 錯誤時

–使用raise語句顯式觸發

•如何處理異常?

–用處理機截獲

–在呼叫環境中傳播異常

兩種觸發異常方法:

發生了 

oracle 

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

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

截獲異常

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

異常的傳播

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

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

捕獲異常:

exception  

when exception1 [or exception2 . . .] then  

statement1;  

statement2;  

. . .  

[when exception3 [or exception4 . . .] then  

statement1;  

statement2;  

. . .]  

[when others then  

statement1;  

statement2;  

. . .]  

•在異常部分when 子句沒有數量限制

•when others 是最後乙個子句

•異常處理部分從關鍵字exception開始

•當異常丟擲後,控制無條件轉到異常處理部分

•在離開塊之前只能執行一種異常處理

預定義異常:

預定義異常是由 oracle 為常見錯誤預先定義的,不需要顯式宣告。

在相應的異常處理例程中引用錯誤的標準名來截獲乙個oracle 伺服器預定義錯誤。

例子:declare  

v_sal       emp.sal%type;  

begin  

select  sal  into v_sal   

from emp  

where empno=999;  

exception  

when no_data_found then  

dbms_output.put_line('沒有查到資料');  

when others then  

dbms_output.put_line('其它異常');  

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錯誤**聯絡起來。

declare  

e_emp_cons     exception;  

pragma exception_init(e_emp_cons,-00001);  

begin  

insert into emp    

select * from emp;  

exception  

when e_emp_cons   then  

dbms_output.put_line('違反唯一性約束');  

end;  

捕獲異常的函式:

•sqlcode 返回

oracle

的錯誤**

•sqlerrm

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

sqlcode

值  說明

0      

沒有異常   

100      no_data_found

異常   負數      其它oracle錯誤號

自定義異常:

在pl/sql塊的宣告部分宣告。

使用raise語句顯式地發布 。

異常的傳遞;

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

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

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

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

–用於建立使用者定義的錯誤訊息的過程

–向使用者返回錯誤,並且其返回格式和其它oracle錯誤的格式相同

–既可以在可執行部分中使用,也可以在異常部分中使用

–錯誤編號必須介於 –20000 和 –20999 之間

–錯誤訊息的長度可長達 2048 個位元組

執行區域:  

begin  

…  delete from emp where demtno=10;  

if sql%notfound then  

』this is not a valid department』);  

end if;  

…  異常區域:  

exception  

when no_data_found then  

』this is not a valid department』);    

end;  

oracle

專題頁面 

Oracle PL SQL異常處理

case語句語法格式如下 case 變數 when 表示式1 then 值1 when 表示式2 then 值2 when 表示式n then 值n else 值n 1 end 1 使用case語句寫乙個pl sql塊,要求輸入員工編號,根據員工的職位進行工資提公升,提公升要求如下 如果職位是cle...

Oracle PL SQL異常處理

oracle的exception init編譯指令declare exception name exception pragma exception init exception name,error code 下面給乙個例項 declare v num number sv num v result...

ORACLE PLSQL 異常處理

例一 create table testerr id number 10 name varchar2 10 insert into testerr values 1,test insert into testerr values 2,test insert into testerr values 3...