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