觸發器是存放在資料庫中的一種特殊類型的子程式。不能被使用者直接調用,而是當特定事件或操作發生時由系統自動
調用執行。觸發器不能接受參數。所以運行觸發器就叫做觸發或點火。Oracle事件指的是資料庫的表進行的insert 、update、delete操作或對視圖進行類似的操作。
觸發器是許多關聯式資料庫系統都提供的一項技術。在Oracle系統裡,觸發器類似過程和函數,都有聲明,執行和異常
處理過程的PL/SQL塊。
觸發器的組成:
觸發事件:在何種情況下觸發;例如:INSERT , UPDATE , DELETE 。
觸發時間:是在觸發事件發生之前還是之後觸發,也就是觸發事件和trigger的操作順序。
觸發器本身:trigger被觸發之後的目的和意圖,正是觸發器本身要做的事。
觸發器頻率:觸發器內定義的動作被執行的次數。有語句級觸發器和行級觸發器。語句級觸發器當觸發事件發生時,只執行一次。行級觸發器當觸發事件發生時,每一行執行一次。
基本文法:
create or replace trigger trigger_name
before | after
insert | delete | update on table_name
for each row
when condition
before和after指出觸發的時序是前觸發還是後觸發。前觸發是在觸發事件之前執行,後觸發是在觸發事件之後執行。for each row 說明觸發器為行觸發器。when子句說明的是觸發的約束條件。
例:編寫一個簡單觸發器,當執行update操作時,輸出helloworld 。
create or replace trigger update_emp_trigger
after
update on emp
for each row
begin
dbms_output.put_line('Hello World');
end ;
測試:
SQL> update emp set sal = sal+ 10 ;
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
14 rows updated
上面的測試中,並沒有調用觸發器,觸發器是系統自動執行的。並不能為使用者直接調用。for each row如果不寫則預設為語句級觸發器。
:new 和 :old 修飾符
:new 修飾符訪問操作完成後列的值。
:old 修飾符訪問操作完成前列的值。
例:使用:new和:old操作符分別擷取更新之前的值,和之後的值。
create or replace trigger update_emp_trigger1
after
update on emp
for each row
begin
dbms_output.put_line(:old.sal || ',' || :new.sal);
end ;
測試:
SQL> update emp set sal = sal+ 10 ;
902,912
1717.44,1727.44
1346.13,1356.13
3115.19,3125.19
1346.13,1356.13
2985.14,2995.14
2568.98,2578.98
3141.2,3151.2
5120.5,5130.5
1611.35,1621.35
1186.99,1196.99
2100.8,2110.8
3141.2,3151.2
1399.17,1409.17
14 rows updated
刪除觸發器
基本文法
DROP TRIGGER trigger_name ;
建立觸發器時,如果發生錯誤可以使用show errors命令來查看錯誤資訊。
包
將資料和子程式組合在一起構成包。與java中的類類似,包在PL/SQL程式設計中,用以實現物件導向的技術。
包的構成分為兩個部分,一個是說明部分,一個是實現部分。
定義包
create or replace package body package_name
is | as
begin
--pl/sql 語句;
end ;
對包內共有元素的調用格式為:包名.類名 。
刪除包
DROP PACKAGE package_name ;