觸發器的分類:
陳述句級觸發器:不管影響多少行,都只會執行一次
行級觸發器:影響多少行,就觸發多少次
一、陳述句觸發器
1、當用戶執行了 insert | update | delete 這些操作之后,可以觸發一系列其他的動作 | 業務 trigerhandler
作用:
在動作執行之前或者之后,觸發業務處理邏輯
插入資料,做一些校驗
2、語法
create {or replace} trigger 觸發器的名稱
before | after
insert | update | delete
on 表名
declare
begin
end;
3、插入員工之后,輸出一句話
-- 新員工入職之后,輸出一句話:歡迎加入我們
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;
1、更新所有員工的工資
--更新所有的工資 輸出一句話
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;

2、判斷員工漲工資后工資一定要大于漲工資前的工資
--判斷員工漲工資后工資一定要大于漲工資前的工資
/*
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;

三、模擬mysql中ID自增長auto_increment
創建一張表
create table person(
pid number primary key,
pname varchar2(20)
);
這里不能向MySQL應用直接插入id為空的值,實作不了自增長
insert into person values(null,'張三');

解決如上問題
使用觸發器來解決上述問題
(1)創建序列:create sequence seq_person_pid;
(2)觸發器
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,'張三');

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96138.html
標籤:其他
