触发器基本语法

一、触发器的语法如下

CREATE OR REPLACE TRIGGER trigger_name<before | after | instead of> <insert | update | delete> ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--触发器代码
END;
Trigger_name是触发器的名称。<before | after | instead of>可以选择before或者after或instead of。
Before表示在DML语句实施前执行触发器,而after表示在在dml语句实施之后执行触发器,instead of触发器用在对视图的更新上。
<insert | update | delete>可以选择一个或多个DML语句,如果选择多个,则用or分开,如:insert or update。
Table_name是触发器关联的表名。
[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;
否则是一个语句级的触发器,每个DML语句触发一次。
WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,触发器才被执行,否则不执行。
Condition中可以通过new对象和old对象(注意区别于前面的:new和:old,在代码中引用需要加上冒号)来引用操作的记录。

二、实例

create or replace trigger tri_gend_det_sync  after insert or update or delete on gend_det
for each row
declare  var_hz_count number(9);
         var_hn_count number(9);
         var_wj_count number(9);
         pragma autonomous_transaction;
begin
    ---删除数据做操作
    if deleting then
    /*  delete from [email protected]
       where gend_gen = :old.gend_gen
             and gend_option = :old.gend_option;*/

      delete from [email protected]
       where gend_gen = :old.gend_gen
             and gend_option = (case when :old.gend_gen =‘RD_PRO_ID‘ then :old.gend_property1 else   :old.gend_option end)
             and :old.gend_synchro = 1; --suyanjiang 2016-9-18

         delete from aid_det
        where exists(select ai_type  from ai_mstr join aid_det on ai_type = aid_type
                     where  aid_sync = 1
                       and aid_type =‘6‘)
          and aid_code = :old.gend_option
          and :old.gend_synchro = 1; --suyanjiang 2016-9-18

      if :new.gend_gen=‘ERROR_CODE‘ then
        delete from [email protected]
          where gend_gen = ‘MISS_CODE‘
          and gend_option = :old.gend_option;
      end if;     

      delete from [email protected]
       where gend_gen = :old.gend_gen
             and gend_option = :old.gend_option ;
    end if;
    ---插入数据做操作
    if inserting  then

      if :new.gend_gen =‘RD_PRO_ID‘ then
        insert into aid_det(aid_type, aid_code, aid_name, aid_valid, aid_sync, aid_rmks,
            aid_crt_by, aid_crt_date, aid_mod_by, aid_mod_date)
        select ‘6‘, :new.gend_option ,:new.gend_name, (case :new.gend_disabled when 0 then 1 else 0 end), 1, ‘‘,
            :new.gend_crt_by , sysdate, :new.gend_crt_by, sysdate
        from dual
        where  not exists(select * from aid_det where aid_type = 6 and aid_code = :new.gend_option );
     end if; 

     /* var_hz_count   := 0;
      select count(*) into var_hz_count
      from [email protected]
      where gend_gen = :new.gend_gen   and
            gend_option = :new.gend_option;

      if var_hz_count =0 then
          insert into [email protected](gend_gen,gend_option,gend_name,gend_crt_by,gend_crt_date,gend_property1,gend_property2,gend_property3,
               gend_property4,gend_disabled,gend_char1,gend_char2,gend_char3,gend_char4,gend_char5,gend_char6,gend_qty1,gend_qty2,gend_property5,gend_property6)
           values(:new.gend_gen,:new.gend_option,:new.gend_name,:new.gend_crt_by,:new.gend_crt_date,:new.gend_property1,:new.gend_property2,
                 (case  when :new.gend_gen  =‘SRC_CAT‘ then  ‘‘ else  :new.gend_property3  end),
           :new.gend_property4,:new.gend_disabled,:new.gend_char1,:new.gend_char2,:new.gend_char3,:new.gend_char4,:new.gend_char5,:new.gend_char6,:new.gend_qty1,:new.gend_qty2,
            :new.gend_property5,:new.gend_property6);
     end if;*/

      var_hn_count   := 0;
      select count(*) into var_hn_count
      from [email protected]
      where gend_gen = :new.gend_gen   and
            gend_option = (case when :new.gend_gen =‘RD_PRO_ID‘ then :new.gend_property1 else   :new.gend_option end)
            and :new.gend_synchro = 1; --suyanjiang 2016-9-18

      if var_hn_count =0 and :new.gend_gen = ‘RD_PRO_ID‘ and :new.gend_property1 is not null and :new.gend_synchro = 1 then
          insert into [email protected](gend_gen,gend_option,gend_name,gend_crt_by,gend_crt_date,gend_property1,gend_property2,gend_property3,
                 gend_property4,gend_disabled,gend_char1,gend_char2,gend_char3,gend_char4,gend_char5,gend_char6,gend_qty1,gend_qty2,gend_property5,gend_property6,
                 gend_property7,gend_property8,gend_property9,gend_property10,gend_property11,gend_property12)
           values(:new.gend_gen,:new.gend_property1,:new.gend_name,:new.gend_crt_by,:new.gend_crt_date,‘‘,:new.gend_property2,
             (case  when :new.gend_gen  =‘SRC_CAT‘ then  ‘‘ else  :new.gend_property3  end),
             :new.gend_property4,:new.gend_disabled,:new.gend_char1,:new.gend_char2,:new.gend_char3,:new.gend_char4,:new.gend_char5,:new.gend_char6,:new.gend_qty1,:new.gend_qty2,
             :new.gend_property5,:new.gend_property6,:new.gend_property7,:new.gend_property8,:new.gend_property9,:new.gend_property10,:new.gend_property11,:new.gend_property12);  

      elsif var_hn_count =0 and :new.gend_gen <>  ‘RD_PRO_ID‘ and :new.gend_synchro = 1 then
           insert into [email protected](gend_gen,gend_option,gend_name,gend_crt_by,gend_crt_date,gend_property1,gend_property2,gend_property3,
                 gend_property4,gend_disabled,gend_char1,gend_char2,gend_char3,gend_char4,gend_char5,gend_char6,gend_qty1,gend_qty2,gend_property5,gend_property6,
                 gend_property7,gend_property8,gend_property9,gend_property10,gend_property11,gend_property12)
           values(:new.gend_gen,:new.gend_option,:new.gend_name,:new.gend_crt_by,:new.gend_crt_date,:new.gend_property1,:new.gend_property2,
             (case  when :new.gend_gen  =‘SRC_CAT‘ then  ‘‘ else  :new.gend_property3  end),
             :new.gend_property4,:new.gend_disabled,:new.gend_char1,:new.gend_char2,:new.gend_char3,:new.gend_char4,:new.gend_char5,:new.gend_char6,:new.gend_qty1,:new.gend_qty2,
             :new.gend_property5,:new.gend_property6,:new.gend_property7,:new.gend_property8,:new.gend_property9,:new.gend_property10,:new.gend_property11,:new.gend_property12);
      end if;

      if :new.gend_gen=‘ERROR_CODE‘ then
        var_wj_count   := 0;
        select count(*) into var_wj_count
        from [email protected]
        where gend_gen = ‘MISS_CODE‘   and
              gend_option = :new.gend_option;

        if var_wj_count =0 then
             insert into [email protected](gend_gen,gend_option,gend_name,gend_crt_by,gend_crt_date,gend_property1,gend_property2,gend_property3,
                   gend_property4,gend_disabled,gend_char1,gend_char2,gend_char3,gend_char4,gend_char5,gend_char6,gend_qty1,gend_qty2)
             values(‘MISS_CODE‘,:new.gend_option,:new.gend_name,:new.gend_crt_by,:new.gend_crt_date,:new.gend_property1,:new.gend_property2,:new.gend_property3 ,
               :new.gend_property4,:new.gend_disabled,:new.gend_char1,:new.gend_char2,:new.gend_char3,:new.gend_char4,:new.gend_char5,:new.gend_char6,:new.gend_qty1,:new.gend_qty2);
        end if;
      end if;

      select count(*) into var_wj_count
      from [email protected]
      where gend_gen=:new.gend_gen
        and gend_option=:new.gend_option;

      if var_wj_count=0 and :new.gend_gen  in (‘SBGD_SCHEME‘,‘DB_PART‘) then
        insert into [email protected](GEND_GEN,GEND_OPTION,GEND_NAME,GEND_PROPERTY1,GEND_PROPERTY2,GEND_PROPERTY3,GEND_PROPERTY4,
                                          GEND_DISABLED,GEND_CHAR1,GEND_CHAR2,GEND_CHAR3,GEND_CHAR4,GEND_CHAR5,GEND_CHAR6,
                                          GEND_QTY1,GEND_QTY2,GEND_PROPERTY5,GEND_PROPERTY6)
        values(:new.gend_gen,:new.gend_option,:new.gend_name,:new.gend_property1,:new.gend_property2,:new.gend_property3,:new.gend_property4,
               :new.gend_disabled,:new.gend_char1,:new.gend_char2,:new.gend_char3,:new.gend_char4,:new.gend_char5,:new.gend_char6,
               :new.gend_qty1,:new.gend_qty2, :new.gend_property5,:new.gend_property6);
      end if;
    end if;
    if updating then
          update [email protected]  set
                                     gend_name       = :new.gend_name,
                                     gend_crt_by     = :new.gend_crt_by,
                                     gend_crt_date   = :new.gend_crt_date,
                                     gend_property1  = :new.gend_property1,
                                     gend_property2  = :new.gend_property2,
                                     gend_property3  = :new.gend_property3,
                                     gend_property4  = :new.gend_property4,
                                     gend_disabled   = :new.gend_disabled,
                                     gend_char1      = :new.gend_char1,
                                     gend_char2      = :new.gend_char2,
                                     gend_char3      = :new.gend_char3,
                                     gend_char4      = :new.gend_char4,
                                     gend_char5      = :new.gend_char5,
                                     gend_char6      = :new.gend_char6,
                                     gend_qty1       = :new.gend_qty1,
                                     gend_qty2       = :new.gend_qty2,
                                     gend_property5  = :new.gend_property5,
                                     gend_property6  = :new.gend_property6
                        where gend_gen  = :new.gend_gen and
                              gend_option = :new.gend_option;

           update [email protected]   set
                                     gend_name       = :new.gend_name,
                                     gend_crt_by     = :new.gend_crt_by,
                                     gend_crt_date   = :new.gend_crt_date,
                                     gend_property1  = :new.gend_property1,
                                     gend_property2  = :new.gend_property2,
                                     gend_property3  =  (case when :new.gend_gen  =‘SRC_CAT‘ then  ‘‘ else  :new.gend_property3  end),
                                     gend_property4  = :new.gend_property4,
                                     gend_disabled   = :new.gend_disabled,
                                     gend_char1      = :new.gend_char1,
                                     gend_char2      = :new.gend_char2,
                                     gend_char3      = :new.gend_char3,
                                     gend_char4      = :new.gend_char4,
                                     gend_char5      = :new.gend_char5,
                                     gend_char6      = :new.gend_char6,
                                     gend_qty1       = :new.gend_qty1,
                                     gend_qty2       = :new.gend_qty2,
                                     gend_property5  = :new.gend_property5,
                                     gend_property6  = :new.gend_property6,
                                     gend_property7  = :new.gend_property7,
                                     gend_property8  = :new.gend_property8,
                                     gend_property9  = :new.gend_property9,
                                     gend_property10  = :new.gend_property10,
                                     gend_property11  = :new.gend_property11,
                                     gend_property12  = :new.gend_property12
                        where gend_gen  = :new.gend_gen and
                              gend_option =( case when :new.gend_gen =‘RD_PRO_ID‘ then :new.gend_property1 else :new.gend_option end)
                              and :new.gend_synchro = 1;

         if :new.gend_gen=‘ERROR_CODE‘ then
           update [email protected]   set
                                     gend_name       = :new.gend_name,
                                     gend_crt_by     = :new.gend_crt_by,
                                     gend_crt_date   = :new.gend_crt_date,
                                     gend_property1  = :new.gend_property1,
                                     gend_property2  = :new.gend_property2,
                                     gend_property3  = :new.gend_property3,
                                     gend_property4  = :new.gend_property4,
                                     gend_disabled   = :new.gend_disabled,
                                     gend_char1      = :new.gend_char1,
                                     gend_char2      = :new.gend_char2,
                                     gend_char3      = :new.gend_char3,
                                     gend_char4      = :new.gend_char4,
                                     gend_char5      = :new.gend_char5,
                                     gend_char6      = :new.gend_char6,
                                     gend_qty1       = :new.gend_qty1,
                                     gend_qty2       = :new.gend_qty2
                        where gend_gen  = ‘MISS_CODE‘ and
                              gend_option = :new.gend_option;
         end if;
     end if;

 commit;

end tri_gend_det_sync;

  

时间: 2024-08-27 04:19:51

触发器基本语法的相关文章

zabbix -- 触发器语法

小Q:山一程,水一程,身向榆关那畔行,夜深千帐灯.               --- 纳兰容若<长相思> 最近一直在学zabbix,总计并归纳了触发器语法参数配置 ,并实时配置搭建,希望可以帮助大家, 有问题欢迎留言解决探讨. 1.语法 2.示例 -------------------------------------------------------------------------------------------------- 1.Zabbix触发器的语法如下: {<se

zabbix自定义触发器语法

Zabbix触发器的语法如下: {<server>:<key>.<function>(<parameter>)}<operator><constant> 用Template App Zabbix Agent模板中的主机ping监控的触发器来进行说明: {Template App Zabbix Agent:agent.ping.nodata(5m)}=1 <server> Template App Zabbix Agent

MySql触发器基本使用及个别语法

/* 触发器 触发器基本语法: create trigger 触发器名称 [before/after] [insert/update/delete] on 表名 for each row begin 触发器正文 end; */ 示例一(仅供参考)create trigger 触发器名称 after insert on 表名for each rowBEGIN DECLARE recIdNo int(11);  DECLARE rownum int(11);  DECLARE maxTemperaN

Oracle-4 - :超级适合初学者的入门级笔记:plsql,基本语法,记录类型,循环,游标,异常处理,存储过程,存储函数,触发器

初学者可以从查询到现在的pl/sql的内容都可以在我这里的笔记中找到,希望能帮到大家,视频资源在 资源, 我自己的全套笔记在  笔记 在pl/sql中可以继续使用的sql关键字有:update delete insert select--into commit  rollback savepoint   ,在这里需要注意的是查询跟以前有些不一样了 plsql由三个块组成:声明部分,执行部分,异常处理部分 declare:在此声明pl/sql用到的变量,类型及游标,以及局部的存储过程的和函数 be

oracle 触发器

触发器--启动触发器alter trigger schema_trigger enable;--禁用触发器alter trigger schema_trigger disable;--删除触发器DROP TRIGGER COMPONT_GIS_TEM; 这个触发器是为了增加部件时,同步更新部件的缓存表,缓存表是为了在拿gis数据时,不用再联表查询街道.社区.大类的名称了缓存表中的sequence是  COMPONT_GIS_TEM_SEQ加入触发器的语句是CREATE OR REPLACE TR

mysql触发器

这两天写项目,有个要求是记录用户登录登出操作,把这些操作写到日志表里去,我觉得这个功能用MySQL的触发器来写,更方便一些,所以在这整理了一下这一过程. 在这里,我就不把项目的所以代码都粘贴过来了,项目用的是hibernate,这里我创建两个简单的表来演示一下这个过程. 1:登录表,记录用户的账号,密码以及在线状态,0表示不在线,1表示在线.对status进行默认约束,默认值就是0. create table login( id int not null primary key auto_inc

触发器使用教程和命名规范

目  录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,例五:语句级触发器之二 9 9,例六:用包封装触发器代码 10 10,触发器命名规范 11 1,触发器简介 触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执 行

触发器的原理和使用方法

触发器 触发器的定义: q触发器是当特定事件出现时自动执行的存储过程 q特定事件可以是执行更新的DML语句和DDL语句 q触发器不能被显式调用 q触发器的功能: q自动生成数据 q自定义复杂的安全权限 q提供审计和日志记录 q启用复杂的业务逻辑 触发器的语法: CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELE

触发器五(建立INSTEAD OF触发器)(学习笔记)

INSTEAD OF触发器 对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作.为了在具有以上情况的复杂视图上执行DML操作需要征用触发器来完成 --创建复杂视图 CREATE OR REPLACE VIEW v_emp20 AS SELECT e.empno,e.ename,e.job,e.sal,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.de