觸發器是被隱含執行的存儲過程
在爲某對象創建觸發器時,首先要保證對象不屬於SYS用戶
因爲不可對SYS擁有的對象創建觸發器
1) 創建BEFORE觸發器
CREATE OR REPLACE TRIGGER tr_fmodify_student
BEFORE UPDATE ON student
BEGIN
IF TO_CHAR(SYSDATE,’DY’,'NLS_DATE_LANGUAGE = AMERICAN’) IN (‘FRI’) THEN
RAISE_APPLICATION_ERROR(-20001,’不能在週五更新表’);
END IF;
END;
其中DY表星期的簡寫
NLS_DATE_LANGUAGE是不同系統之間時間轉換
例子中是英文顯示,在網上搜了一下還有例如中文和日文的顯示,貼一下~
'NLS_DATE_LANGUAGE = Japanese'
'NLS_DATE_LANGUAGE = ''SIMPLIFIED CHINESE'''——這裏有多個單引號 需要注意下~
平時用來測試的異常處理我們都是通過dbms_output.put_line來輸出異常信息,但是在實際的應用中,需要把異常信息返回給調用的客戶端。
RAISE_APPLICATION_ERROR 是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其他機器上的SQLPLUS或者其他前臺開發語言)
RAISE_APPLICATION_ERROR 的聲明:
PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
裏面的錯誤代碼和內容,都是自定義的。說明是自定義,當然就不是系統中已經命名存在的錯誤類別,是屬於一種自定義事務錯誤類型,才調用此函數。
error_number_in 只容許從 -20000 到 -20999 之間,這樣就不會與 ORACLE 的任何錯誤代碼發生衝突。
error_msg_in 的長度不能超過 2k,否則截取 2k。
2) 創建AFTER觸發器——在執行了DML語句後被觸發的觸發器
CREATE OR REPLACE TRIGGER tr_insert
AFTER INSERT ON student
BEGIN
DBMS_OUTPUT.PUT_LINE(‘數據已插入’);
END;
3) 創建行觸發器——在執行DML語句時,每作用一行被觸發一次的觸發器
CREATE OR REPLACE TRIGGER tr_id
AFTER INSERT ON student
BEGIN
IF :NEW.id<= 3 THEN
DBMS_OUTPUT.PUT_LINE(‘ID < 3’);
END IF;
END;
4) 刪除觸發器
DROP TRIGGER tr_fmodify_student;