触发器七(复合触发器)(学习笔记)

复合触发器

复合触发器是在Oracle 11g之后引入进来的一种新结构的触发器,复合触发器既是表级触发器又是行级触发器。在之前针对于不同级别的触发器,如果要在一张数据表上完成表级触发(BEFORE和AFTER)与行级触发(BEFORE和AFTER)则需要编写四个触发器才可以完成,而有了复合触发器之后,只需要一个触发器就可以定义完全部的四个功能

使用复合触发器可以捕获四个操作事件:

  1. 触发执行语句之前(BEFORE STATEMENT)
  2. 触发语句中的每一行发生变化之前(BEFORE EACH ROW)
  3. 触发语句中的每一行发生变化之后(AFTER EACH ROW)
  4. 触发执行语句之后(AFTER STATEMENT)

复合触发器创建语法

--复合触发器创建语法
CREATE [OR REPLACE] TRIGGER 触发器名称
    FOR [INSERT | UPDATE | UPDATE OF 列名称 [,列名称,...] | DELETE] ON 表名称
    COMPOUND TRIGGER
        [ BEFORE STATEMENT IS    -- 语句执行前触发(表级)
            [ 声明部分 ; ]
        BEGIN
            程序主体部分 ;
        END BEFORE STATEMENT ; ]
        [ BEFORE EACH ROW IS    -- 语句执行前触发(行级)
            [ 声明部分 ; ]
        BEGIN
            程序主体部分 ;
        END BEFORE EACH ROW ; ]
        [ AFTER STATEMENT IS    -- 语句执行后触发(表级)
            [ 声明部分 ; ]
        BEGIN
            程序主体部分 ;
        END AFTER STATEMENT ; ]
        [ AFTER EACH ROW IS    -- 语句执行后触发(行级)
            [ 声明部分 ; ]
        BEGIN
            程序主体部分 ;
        END AFTER EACH ROW ; ]
    END ;
    /

 示例一、创建复合触发器

--创建复合触发器
create or replace trigger compound_trigger
  FOR INSERT OR UPDATE OR DELETE  on dept
   compound TRIGGER

    BEFORE STATEMENT IS  -- 语句执行前触发(表级)
    BEGIN
      DBMS_OUTPUT.put_line(‘1、BEFORE STATEMENT .‘) ;
    END BEFORE STATEMENT;
    BEFORE EACH ROW IS  -- 语句执行前触发(行级)
    BEGIN
      DBMS_OUTPUT.put_line(‘2、BEFORE EACH ROW .‘) ;
    END BEFORE EACH ROW;
    AFTER STATEMENT IS  -- 语句执行后触发(表级)
    BEGIN
      DBMS_OUTPUT.put_line(‘3、AFTER STATEMENT .‘) ;
    END AFTER STATEMENT;
    AFTER EACH ROW IS  -- 语句执行后触发(行级)
    BEGIN
      DBMS_OUTPUT.put_line(‘4、AFTER EACH ROW .‘) ;
    END AFTER EACH ROW;

end compound_trigger;
--测试
INSERT INTO dept(deptno,Dname,loc)
VALUES(97,‘RD‘,‘深圳‘);
SELECT * FROM dept;
--结果
1、BEFORE STATEMENT .
2、BEFORE EACH ROW .
4、AFTER EACH ROW .
3、AFTER STATEMENT .

示例二、

定义触发器,此触发器可以完成如下的功能

在周末时间不允许更新emp表数据;

在更新数据时,要求将所有增加的数据自动变为大写;

在更新完成之后,新增雇员的工资不得高于公司的平均工资

--创建复合触发器
create or replace trigger emp_compound_trigger
  FOR INSERT OR UPDATE OR DELETE on emp
  compound TRIGGER
           BEFORE STATEMENT IS         --表级,语句执行前触发
            v_curweek                     VARCHAR2(20);          --声明,--周末不能更新
           BEGIN
             SELECT to_char(SYSDATE,‘day‘) INTO v_curweek FROM dual;
             IF TRIM(v_curweek) IN (‘星期六‘,‘星期日‘) THEN
               raise_application_error(-20004,‘周末不允许更新员工表emp‘);
               END IF;
                 EXCEPTION
            WHEN OTHERS THEN
              dbms_output.put_line(SQLCODE||SQLERRM);
           END BEFORE STATEMENT;
           BEFORE EACH ROW IS                             --行级,语句执行前触发
                v_avgsal           emp.sal%TYPE;           --声明平均工资变量
           BEGIN
             IF inserting OR updating THEN
               :new.ename:=upper(:new.ename);
               :new.job:=upper(:new.job);
             END IF;
             IF inserting THEN
                 SELECT AVG(sal) INTO v_avgsal FROM emp;
                 IF :new.sal > v_avgsal THEN
                   raise_application_error(-20005,‘新员工工资不重高于公司平均工资!‘);
                 END IF;
             END IF;
               EXCEPTION
            WHEN OTHERS THEN
              dbms_output.put_line(SQLCODE||SQLERRM);
          END BEFORE EACH ROW;

end emp_compound_trigger;
--测试
INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,deptno)
VALUES(8888,‘test‘,‘clerk‘,7369,SYSDATE,1000,10);

--时间改为周末
INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,deptno)
VALUES(9999,‘test1‘,‘clerk‘,7369,SYSDATE,5000,20);
时间: 2024-10-16 05:12:40

触发器七(复合触发器)(学习笔记)的相关文章

七、Android学习笔记_JNI hello world

1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同. : ${ORIGINAL_PATH=${PATH}} if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then PATH="/usr/local/bi

《七周七语言》学习笔记——Ruby——第一天:找个保姆

感觉学了东西很快就会忘记,不会留下什么,趁这次看<七周七语言>,把其中觉得有用的东西记录下来,方便以后自己查阅,这篇应该就是记录的开始了. Ruby是一门面向对象的.解释型的.动态类型的脚本语言.面向对象,说明了这门语言具有封装.继承.多态这些特性:解释型,意味着它由解释器而不是编译器来执行:动态类型,即类型是在运行时绑定而非编译时绑定:脚本语言,则说明了它很短!易上手!并且只在调用的时候解释执行. 编程模型:一切皆对象,从一个数到bool值,都被定义为对象,都有自己的方法 判断结构:块形式和

OSI七层模型学习笔记

1.简介 什么是OSI模型呢? OSI模型全名Open System InterConnect 即开放式系统互联,是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI. 计算机通讯需要用到必要的软件支持,它就是计算机网络参考模型(即计算机网络软件),最经典的就是我们所要讲解的OSI模型.它是通过一个机器上的一个应用进程与另一个机器上的进程进行信息交互. 2.OSI七层模型解析 OSI(Open System Interconnection,开放式系统互

(七)Oracle学习笔记—— 游标

1.游标简介 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区.这个区包含了已经处理完的行数.指向被分析语句的指针,整个区是查询(select)语句返回的数据行集.游标就是指向上下文区句柄或指针. 2.游标使用 2.1 定义一个游标 CURSOR cursor_name IS select_statement; 例如:把数据表中emp中部门号为20的员

七、Hadoop学习笔记————调优之Hadoop参数调优

dfs.datanode.handler.count默认为3,大集群可以调整为10 传统MapReduce和yarn对比 如果服务器物理内存128G,则容器内存建议为100比较合理 配置总量时考虑系统调优块,双路四核2*4*2=16g,则总量设置为10到12比较合适,需要预留空间给其他服务器 需要给master分配足够资源,并且分配受限于yarn hadoop调优需要不断尝试,没有固定的套路

oracle 触发器 学习笔记

触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功能: 1. 允许/限制对表的修改 2. 自动生成派生列,比如自增字段 3. 强制数据一致性 4. 提供审计和日志记录 5. 防止无效的事务处理 6. 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D