Oracle 起步日記(7)——觸發器

 

觸發器是被隱含執行的存儲過程

 

在爲某對象創建觸發器時,首先要保證對象不屬於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;

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章