Oracle快速入门(触发器)

   日期:2020-09-20     浏览:105    评论:0    
核心提示:触发器的分类:语句级触发器:不管影响多少行,都只会执行一次行级触发器:影响多少行,就触发多少次一、语句触发器1、当用户执行了 insert | update | delete 这些操作之后,可以触发一系列其他的动作 | 业务 trigerhandler作用:在动作执行之前或者之后,触发业务处理逻辑插入数据,做一些校验2、语法create {or replace} trigger 触发器的名称 before | afterinsert | update | deleteon 表名de

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

一、语句触发器

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、判断员工涨工资后工资一定要大于涨工资前的工资

--判断员工涨工资后工资一定要大于涨工资前的工资

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服