-----------觸發器的語法--------- CREATE [OR REPLACE] TRIGGER 觸發器名稱 {BEFORE|AFTER} BEFORE|AFTER:觸發觸發器數據操作之前執行觸發器還是之後執行觸發器。 {DELETE|INSERT|UPDATE[OF列名]} DELETE|INSERT|UPDATE[OF列名]:觸發觸發器數據操作的類型。 ON 表名 [FOR EACH ROW [WHEN(條件)]]FOR EACH ROW:行級觸發器的關鍵字。WHEN:給行級觸發器加一個條件,滿足條件才執行,從而實現行級判斷。 PL/SQL塊 ------------實現一個自動增長的ID列的觸發器------------- --創建一個id,name的person表-- create table person( id number primary key, name varchar2(20) not null ); ---因為是自動增長的觸發器,所以要先創建一個增長的序列-- create sequence id_incr start with 1001 increment by 1 nomaxvalue nocycle cache 10; --------創建好序列之後就可以創建觸發器了------------------ --創建一個插入name時觸發ID自動插入的觸發器-- create or replace trigger id_tri before insert on person for each row declare nextid number; begin select id_incr.nextval into nextid from dual; :new.id:=nextid; end; -----所有准備工作完成就可以插入數據了---- insert into person(name) values('張三'); insert into person(name) values('李四'); select * from person; -----------實現一個插入數據時判斷姓名是否以j開頭的觸發器------------- 表還是person表 create or replace trigger j_name before insert on person for each row begin if :new.name like 'j%' then raise_application_error(-20000,'不能使用j開頭的姓名'); end if; end;
insert into person(name) values('j雲霞');執行這條語句時就會拋出應用程序異常,提示不能使用j開頭的姓名。相當於高級的約束。
------------------在觸發器中針對某種類型的觸發實現針對的功能--------- 表還是person表 create or replace trigger is_what before insert or update or delete on person begin if inserting then dbms_output.put_line('這是插入數據時觸發的'); elsif updating then dbms_output.put_line('這是更新數據時觸發的'); else dbms_output.put_line('這是刪除數據時觸發的'); end if; end;
使用下列三條語句體來檢測:
set serveroutput on; insert into person(name) values('徐文帥'); set serveroutput on; update person set name='張三' where name='徐文帥'; set serveroutput on; delete person where name='張三';
注意:is_what觸發器是語句級觸發器,所以你在增刪改檢測的時候,不論person有幾條語句被牽扯到,它只會put_line一條提示語句。這就是語句級觸發器和行級觸發器的一個區別。
------------------------給id創建一個列級觸發器-------- create or replace trigger id_up before update of id on person begin dbms_output.put_line('更新id的觸發器被觸發了'); end; set serveroutput on;
update person set id=0000 where id='1001'; 這條語句執行的時候就會觸發id_up觸發器。 set serveroutput on; update person set name='aaa' where name='bbb';這條語句執行的時候就不會觸發id_up觸發器。