Oracle資料庫之PL SQL異常處理

2021-07-03 07:08:14 字數 4442 閱讀 4003

異常指的是在程式執行過程中發生的異常事件,通常是由硬體問題或者程式設計問題所導致的。

pl/sql程式設計過程中,即使是寫得最好的程式也可能會遇到錯誤或未預料到的事件。乙個健壯的程式都應該能夠正確處理各種異常情況,並盡可能從中恢復。

1. 異常處理

異常處理是用來處理正常執行過程中未預料的事件。pl/sql程式塊一旦產生異常而沒有指出如何處理時,程式就會自動終止整個程式執行。

pl/sql程式設計過程中,有三種型別的異常:

1.預定義異常

對這種異常情況的處理,無需在程式中定義,當pl/sql程式違反oracle規則或超越系統限制時隱式引發。

2.非預定義異常

其他標準的oracle錯誤。對這種異常情況的處理,需要使用者在程式中定義,然後由oracle自動將其引發。

3.使用者定義異常

程式執行過程中,出現程式設計人員認為的非正常情況。對這種異常情況的處理,需要使用者在程式中定義,然後顯式地在程式中將其引發。

異常處理通常放在pl/sql程式的後部,語法結構為:

exception

when

then statement [ statement ]...

2. 預定義的異常處理

常見預定義異常:

錯誤號異常名稱

說明ora-00001

dup_val_on_index

重複索引值,違反了唯一性限制,當在唯一索引所對應的列上鍵入重複值時觸發

ora-01001

invalid_cursor

試圖使用乙個無效的游標

ora-01012

not_logged_on

沒有連線到oracle

ora-01017

login_denied

無效的使用者名稱/口令

ora-01403

no_data_found

沒有找到資料時觸發

ora-01422

too_many_rows

返回多行

ora-01722

invalid_number

轉換為數字失敗時觸發

ora-06511

cursor_already_open

試圖開啟乙個已處於開啟狀態的游標

ora-06592

case_not_found

當case條件都不滿足時觸發

對預定義異常的處理,只需在pl/sql塊的異常處理部分,直接引用相應的異常情況名,並對其完成相應的異常錯誤處理即可。

示例1:

declare

stock_price number := 9.73;

net_earnings number := 0;

pe_ratio number;

begin

pe_ratio := stock_price / net_earnings;

dbms_output.put_line('運算結果 = ' || pe_ratio);

exception

when zero_divide then

dbms_output.put_line('/ by zero');

pe_ratio := null;

end;

執行結果:

/ by

zero

為避免除0異常,可以採用如下示例2方式解決:

示例2:

declare

stock_price number := 9.73;

net_earnings number := 0;

pe_ratio number;

begin

pe_ratio :=

case net_earnings

when

0then

null

else stock_price / net_earnings

end;

end;

示例3:

declare

default_number number := 0;

begin

insert

into t values(to_number('100.00', '9g999'));

exception

when invalid_number then

dbms_output.put_line('使用預設值替換非法數字');

insert

into t values(default_number);

end;

執行結果:

使用預設值替換非法數字
3. 非預定義的異常處理

非預定義異常有錯誤號沒有名字,處理的辦法是:自己定義乙個名字,繫結到錯誤號,捕獲錯誤名。處理這類異常,首先必須對非預定義的oracle異常進行定義。

如:

myexcp exception;
然後使用exception_init語句與標準的oracle錯誤聯絡起來,如:

pragma exception_init(myexcp,-02292);
說明:ora-02292是違反完整性約束的錯誤**。

示例:

declare

myexcp exception;

pragma exception_init(myexcp,-02292);

dno scott.emp.deptno%type;

begin

dno := &dept_no;

delete

from scott.dept where deptno=dno;

exception

when myexcp then

delete

from scott.emp where deptno=dno;

delete

from scott.dept where deptno=dno;

end;

4. 使用者定義異常處理

我們可以在任何pl/sql匿名塊,子程式或包的宣告部分宣告自己的異常。使用者定義的異常是通過使用raise語句顯式觸發的。

一般使用者定義異常的處理流程為:定義異常->丟擲異常->捕獲及處理異常。

示例:

declare 

invalidcategory exception; -- 定義異常

category varchar2(10);

begin

category := '&category';

if category not

in ('附件','頂蓋','備件') then

raise invalidcategory; -- 丟擲異常

else

dbms_output.put_line('您輸入的類別是'|| category);

endif;exception

when invalidcategory then -- 捕獲及處理異常

dbms_output.put_line('無法識別該類別');

end;

如果指定true,pl/sql把error_code上的錯誤資訊新增到堆疊的頂部。指定false,pl/sql替換error_code錯誤堆疊,預設值為false。

示例1:

declare

empno employees.employee_id%type;

no_such_row exception;

begin

empno := &empno;

update employees set salary = salary+100

where id = empno;

if sql%notfound then

raise no_such_row;

endif;exception

when no_such_row then

end;

示例2:

begin

update emp set deptno=80

where empno=1111;

if sql%notfound then

endif;

exception

when others then

dbms_output.put_line(sqlcode||'-->'||sqlerrm);

end;

sqlcode用於取得oracle錯誤號。

sqlerrm則用於取得與之相關的錯誤訊息。

ORACLE資料庫PLSQL筆記

oracle資料庫plsql筆記 pl sql 是oracle的程式語言,用於擴充套件sql的程式設計能力,為資料庫程式增加了許多可能的功能。它允許將過程控制語句與 sql語句結合使用oracle 特有的程式語言pl sql補充了標準的關聯式資料庫語言sql,提供了各種過程化特性,包括迴圈 if t...

PLSQL連線oracle資料庫

方法一 instantclient 12 2 1 安裝 instantclient 12 2 軟體 免安裝oracle客戶端 2 plsql配置 開啟plsql 點取消,彈出plsql主介面 選單欄的tools 屬性preferences 首選項 連線 3 連線資訊 1 連線資訊 可以是ip 152...

plsql 匯出oracle資料庫

plsql 匯出資料庫有兩個問題,乙個是只匯出結構,乙個是匯出表結構加資料這樣的,首先人家讓我導成sql語句 這不是簡單,首先開啟plsql 一 匯出結構 1 然後tools export user objects.然後出來一片空白 2 要選擇哪個user 3 上面會出現好多表,選擇一下你要匯出的表...