畢 桂 徐 霖
無錫工藝職業技術學院,江蘇 宜興 214206
談談Oracle數據庫異常處理
畢 桂 徐 霖
無錫工藝職業技術學院,江蘇 宜興 214206
進行Oracle數據庫開發中,在程序的運行過程中,可能會因為各種原因發生這樣或那樣的錯誤,就需要針對錯誤進行處理,異常處理就是這樣的一段程序。有了異常處理就可以提高我們的程序代碼質量,一個好的程序都必含有能夠處理發生的任何錯誤。PL/SQL用異常和異常處理器來實現錯誤處理,它的異常處理機制提供了能夠處理前面未處理異常的功能。
Oracle數據庫;程序代碼;異常處理;PL/SQL
Oracle中出現錯誤的情形通常分為程序在編譯時錯誤(compile-time error)和程序在運行時錯誤(run-timeerror)。一個程序在處理運行時出現錯誤,這是異常處理,一個程序在編譯時的錯誤,并不是異常處理,我們這里所說的異常處理是指程序通過編譯沒有錯誤,而是在程序運行中出現的錯誤。當程序在運行時發生錯誤,異常被觸發,程序的正常執行過程被終止,程序無條件轉到異常處理部分,在Oracle數據庫允許聲明其他異常條件類型以擴展錯誤/異常處理,有了這樣的擴展使PL/SQL的異常處理非常靈活。在Oracle數據庫中,PL/SQL將異常分為預定義異常和用戶定義異常。
(一)預定義異常
Oracle數據庫自身為用戶提供了大量的、可以在PL/SQL中使用的預定以異常,方便用戶檢查代碼失敗的一般原因,它們都定義在Oracle的核心PL/SQL中。每當PL/SQL違背了Oracle原則或超越了系統依賴的原則時就會隱式的產生內部異常。每個Oracle錯誤都有一個號碼,在PL/SQL中通過名字處理預定義異常,PL/SQL為一些Oracle公共錯誤進行了預定義。如SELECT INTO語句返回多行數據時,PL/SQL就會觸發預定義異常TOO_MANY_ROWS。
(二)自定義異常
用戶自定義異常不一定必須是Oracle返回的系統錯誤,這些錯誤Oracle數據庫本身無法知曉,也不能控制。用戶可以在自己的應用程序中創建可觸發及可處理的自定義異常,和預定義異常不同的是,用戶定義的異常,系統不會自動觸發(這種異常對系統來說不一定是錯誤),需要用戶來觸發異常,另外用戶定義的異常,需要在聲明部分定義。用戶定義的異常處理部分基本上和預定義異常相同。
Oracle數據庫內部預定義異常僅僅20個左右,而在實際程序運行過程中產生的異常情況就會很多,為此Oracle數據庫經常使用錯誤編號和相關描述給出異常信息。數據庫設計人員常常會根據實際的業務邏輯情況定義一些特殊異常。Oracle數據庫的自定義異??梢苑譃殄e誤編號異常和業務邏輯異常。
(一)錯誤編號異常
錯誤編號異常是指Oracle數據庫系統發生錯誤時,系統就會顯示出錯誤編號和相關信息的異常。用戶可以根據錯誤編號來完成異常處理,由于錯誤編號比較抽象,不便于用戶理解和記憶。對于這種類型的異常,首先在Oracle數據中PL/SQL塊的聲明部分使用EXCEPTION類型定義一個異常變量名,然后使用語句PRAGMA EXCEPTION _INIT為“錯誤編號”關聯這個異常變量名,最后可以像對待Oracle數據庫系統預定義異常一樣處理了。我們通過一個實例,來說明一下,我們錯誤編號異常的使用。假設我們在Oracle數據庫中已經創建了一個表單,名為student(編號(id),姓名(name),性別(sex))
declare
primary_id exception;——定義一個異常變量
pragma exception_init(primary_id,-00001);——關聯錯誤號和異常變量名
begin
insert into student values(2,'張三','男');——向student表中插入一條與已有主鍵值重復的記錄,以便引發異常
exception
when primary_id then ——若oracle捕獲到的異常為-00001異常
dbms_output.put_line('主鍵已存在,不允許重復!');——輸出異常描述信息
end;
通過運行結果可以看到,使用異常處理機制可以預防Oracle數據庫系統因為引發異常而導致程序崩潰的作用,它可以讓我們書寫的程序有機會進行自動檢測和修改錯誤。從上面的例子可以看出自定義異常比較容易理解和記憶,也方便數據庫人員使用。
(二)業務邏輯異常
在數據庫的實際開發過程中,數據庫開發人員有時會根據開發對象的業務邏輯情況自己定義一個異常,通過這種方法來提醒數據庫開發人員操作違反業務邏輯規則,從而引發自己定義的異常,中斷程序的運行來進行自定義異常的處理。業務邏輯異常首先是需要在DECLARE進行聲明一個異常變量;然后在BEGIN過程中先給出需要的業務邏輯規則再執行RAISE語句;最后在EXCEPTION中進行編寫對異常進行處理的程序語句。下面我們通過一個實例來看看如何定義和引發業務邏輯異常:
declare
null_exception exception;——聲明一個異常變量
S student %rowtype;
begin
S.id:=3;——ID是主鍵進行賦值,
insert into student values(S.id,S.name,S.sex);——向student表中插入一條記錄
if S.name is null then ——判斷表的name的值是否為空
raise null_exception;——引發異常,進行異常處理
end if;
exception
when null_exception then
dbms_output.put_line('name不可以為空');——當引發異常時,輸出異常信息
rollback;
end;
通過運行結果可以看到,業務邏輯異常定義成功。程序就可以進行檢測我們向數據庫表單STUDENT中插入數據時是否存在學生NAME為空的情況了。
總的來看,在一段沒有語法錯誤的程序代碼中,因為出現了不太“合格”數據而導致程序無法運行。我們希望提高自己的代碼質量,使得我們的程序更加健壯,我們對程序做了異常處理。從上面的異常處理過程中,我們可以看出:對于預定義異常和錯誤編號異常是由我們Oracle數據庫系統判斷的,但是對于業務邏輯異常,我們Oracle數據庫系統本身就無法知道了,通常我們是通過一個引發異常的機制(RAISE語句)來完成,從而可以實現對業務邏輯規則的判斷。
[1]劉竹林.數據庫設計與Oracle數據庫應用教程.清華大學出版社,北京大學出版,2009.
[2]張曉林,吳斌,晁陽.Oracle數據庫開發基礎教程.清華大學出版社,2009.
[3]趙宇蘭.Oracle數據庫應用技術.合肥工業大學出版社,2014.
TP
A
1006-0049-(2017)17-0187-01