zoukankan      html  css  js  c++  java
  • oracle触发器

    *触发器:*

    *当用户执行了 insert|update|delete这些操作之后,可以发出一系列其他的动作。*

    *作用:*

    在动作执行之前或者之后,触发业务处理逻辑

    插入数据,做一些校验

    *语法:*

    Create [or replace] triger 触发器名称 Before | after  Insert |update|delete
    
    On 表名
    
    [for each row]
    Declare
    Begin
      pl/sql 语句
    End;
    

    *案例 数据校验*

    --星期六老板不在,不能办理新员工入职

    插入数据之前

    判断当前日期是否是周六

    如果是周六,就不能插入新员工

    create or replace trigger tri_datacheck
    
     before insert on emp
    
    declare
    
     **--声明变量**
    
     vday varchar2(10);
    
    begin
    
     **-- 查询当前系统日期**
    
     select trim(to_char(sysdate, 'day')) into vday from dual;
    
     **--判断当前日期**
    
     if vday = '星期六' then
    
      dbms_output.put_line('老板不在,不能办理入职');
    
      **--自定义,抛出系统异常**
    
      raise_application_error(-20001, '老板不在,不能办理入职');
    
     end if;
    
    end;
    

    测试:

    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

    values (0000, 'ZYQ', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 20);

    执行插入语句之后,我们会在output窗口中看到我们想要的输出结果。

    如果如果我们在星期六办理入职的话,会提示

    *触发器的分类:*

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

    行级触发器:影响多少行,就触发多少次

    ​ :old 代表旧的记录,更新前的记录

    ​ :new 代表的是新的记录

    语句级触发器案例:

    create or replace trigger tri_updatesal4
     after
     update
      on person
    --注意:语句级触发器就不要写for each row了
    declare
    begin
     dbms_output.put_line('更新了所有员工的工资');
    end;
    

    执行该触发器:

    begin
      update person a set a.pname='李四' WHERE 1=1;
    end;
    

    DBMS OUT:

    更新了所有员工的工资

    行级触发器案例:

    *小案例:给每位员工的工资加100块钱*

    -- Created on 2020/12/17 by ZHAOYONGQIANG

    --更新所有员工的工资 每****更新一位员工的工资就输出一句话

    create or replace trigger tri_updatesal
     after
     update
      on emp
     for each row
    declare
    begin
     dbms_output.put_line('更新了一位员工的工资');
    end;
    

    update emp a set a.sal=a.sal+100 WHERE 1=1;

    输出结果:

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    更新了一位员工的工资

    *--小案例 old 和 before*

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

    思路:触发器:before

    旧的工资

    新的工资

    如果旧的工资大于新的工资,抛出异常,不让他执行成功

    create or replace trigger tri_updatesalflag
     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=sal-10;

    触发器实现类似MySQL主键自增:***

    --触发器

    create or replace trigger tri_add_person_pid
    
    before
    
    insert
    
    on person
    
    for each row
    
    declare
    
    begin
    
     dbms_output.put_line(:new.pname);
    
     **--给新纪录pid赋值**
    
     select seq_person_pid.nextval into :new.pid from dual;
    
    end;
    

    --测试

    insert into person values(null,'赵四');

    SELECT * FROM person;


  • 相关阅读:
    iOS新手在引入第三方出现的几个小问题
    XMPP安装中遇到需要卸载openfire的步骤
    KVC
    SQLite错误码
    简单对象的本地化(以图片为例)
    使用MD5完成自定义Person对象的加密过程
    IOS--工作总结--post上传文件(以流的方式上传)
    IOS开发系列 --- 核心动画
    监听键盘 防止输入时覆盖掉textfiled
    比较选择的开始时间和结束时间的大小
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14259459.html
Copyright © 2011-2022 走看看