Oracle快速入門(觸發器)

2020-09-19 16:01:03

觸發器的分類:
語句級觸發器:不管影響多少行,都只會執行一次
行級觸發器:影響多少行,就觸發多少次

一、語句觸發器

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,'張三');

在這裡插入圖片描述