RAISE_APPLICATION_ERROR 是將應(yīng)用程序?qū)S械腻e(cuò)誤從服務(wù)器端轉(zhuǎn)達(dá)到客戶端應(yīng)用程序。
RAISE_APPLICATION_ERROR 的聲明:
PROCEDURE RAISE_APPLICATION_ERROR
( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
里面的錯(cuò)誤代碼和內(nèi)容,都是自定義的。說明是自定義,當(dāng)然就不是系統(tǒng)中已經(jīng)命名存在的錯(cuò)誤類別,是屬于一種自定義事務(wù)錯(cuò)誤類型,才調(diào)用此函數(shù)。
error_number_in 之容許從 -20000 到 -20999 之間,這樣就不會(huì)與 ORACLE 的任何錯(cuò)誤代碼發(fā)生沖突。
error_msg_in 的長(zhǎng)度不能超過 2K,否則截取 2K。
舉個(gè)例吧:
阻止小于18歲的用戶增加到數(shù)據(jù)庫(kù) employee 表中
CREATE OR REPALCE TRIGGER minimun_age_check
BEFORE INSERT ON employee
FOR EACH ROW
BEGIN
IF ADD_MONTHS( :new.birth_date, 18*12) > SYSDATE
THEN
RAISE_APPLICATION_ERROR(-20001, 'Employees must at least eighteen years of age.');
END IF;
END;
在客戶端,你可以寫一個(gè)類似下面的程序,來測(cè)試一下。
DECLARE
no_babies_allowed EXCEPTION;
/*將名稱與用于觸發(fā)器中的錯(cuò)誤號(hào)碼關(guān)聯(lián)起來*/
PRAGMA EXCEPTION_INIT(no_babies_allowed, -20001);
BEGIN
INSERT INTO employee ....;
EXCEPTION
WHEN no_babies_allowed
THEN
/*
|| SQLERRM 將傳遞給內(nèi)置過程 RAISE_APPLICATION_ERROR 的消息返回
*/
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;