Oracle快速入门(触发器)

触发器的分类:
语句级触发器:不管影响多少行,都只会执行一次
行级触发器:影响多少行,就触发多少次

一、语句触发器

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/108666070
今日推荐