觸發器的分類:
語句級觸發器:不管影響多少行,都只會執行一次
行級觸發器:影響多少行,就觸發多少次
insert | update | delete
這些操作之後,可以觸發一系列其他的動作 | 業務 trigerhandler作用:
在動作執行之前或者之後,觸發業務處理邏輯
插入資料,做一些校驗
create {or replace} trigger 觸發器的名稱
before | after
insert | update | delete
on 表名
declare
begin
end;
-- 新員工入職之後,輸出一句話:歡迎加入我們
create or replace trigger tri_test1
after
insert
on emp
declare
begin
dbms_output.put_line('歡迎加入我們');
end;
向emp表上插入
insert into emp(empno,ename) values(9527,'XAIOHONG');
插入成功
select * from emp;
插入成功的同時並且輸出了一句話
--資料校驗,星期五老闆不在,不能辦理新員工入職
--在插入資料之前
--判斷當前日期是否是週五
--如果是週五,就不能插入資訊
create or replace trigger tri_test2
before
insert
on emp
declare
-- 宣告變數
vday varchar2(10);
begin
-- 查詢當前日期
select trim(to_char(sysdate,'day')) into vday from dual;
-- 判斷當前日期
if vday = 'friday' then
dbms_output.put_line('老闆不再,不能辦理入職');
--丟擲系統異常
raise_application_error(-20001,'老闆不再,不能辦理入職');
end if;
end;
當插入資訊的時候
insert into emp(empno,ename) values(9528,'XIAOHONG2');
:old 代表舊的記錄,更新前的記錄
:new 代表的是新的記錄
create {or replace} trigger 觸發器的名稱
before | after
insert | update | delete
on 表名
[for each row]
declare
begin
end;
--更新所有的工資 輸出一句話
create or replace trigger tri_test3
after
update
on emp
for each row
declare
begin
dbms_output.put_line('更新了資料');
end;
update emp set sal = sal + 10;
--判斷員工漲工資後工資一定要大於漲工資前的工資
/*
200 --> 100
觸發器:before
舊的工資
新的工資
如果舊的工資大於新的工資,丟擲異常,不讓它執行成功
*/
create or replace trigger tri_updatesal
before
update
on emp
for each row
declare
begin
if :old.sal > :new.sal then
raise_application_error(-20002,'舊的工資不能大於新的工資');
end if;
end;
update emp set sal = 200 where empno = 7499;
增加資料
update emp set sal = sal + 10;
update emp set sal = sal - 10;
建立一張表
create table person(
pid number primary key,
pname varchar2(20)
);
這裡不能向MySQL應用直接插入id為空的值,實現不了自增長
insert into person values(null,'張三');
解決如上問題
使用觸發器來解決上述問題
create sequence seq_person_pid;
create or replace trigger tri_add_person_pid;
before
insert
on person
for each row
declare
begin
dbms_output.put_line(:new.pname);
end;
插入資料
insert into person values(null,'張三');