`
gapele
  • 浏览: 57026 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何使用oracle中的行级触发器和语句级触发器

阅读更多

问题来源:
  实际的项目中,有一张用户基本信息表sd2_userinfo,当用户重新注册时,要删除原来的用户信息记录,同时要删除该用户相关的其他表的信息。
  表说明:
   sd2_userinfo 用户基本信息表(id number 主键,troopid为该用户的战队ID,外键为sd2_troop.troopid)
   sd2_trade    用户交易表
    >desc sd2_trade
     Name     Null?    Type

     TRADEID  NOT NULL NUMBER  --交易ID号
     GOODSID           NUMBER  --交易的物品ID号
     OWNER             NUMBER  --物品的主人,外键为sd2_userinfo.id
     PRICE             NUMBER  --交易的价格
  sd2_troop 用户战队信息
   >desc sd2_troop
     Name        Null?    Type

     TROOPID     NOT NULL NUMBER         --战队ID号
     TROOPNAME            VARCHAR2(100)  --战队名称
     LEADER               NUMBER         --队长,外键为sd2_userinfo.id
     NUMBERS              NUMBER         --成员数
     CREATETIME           VARCHAR2(15)   --战队创建时间
     PK_WIN               NUMBER         --战队战斗胜利次数
     PK_LOST              NUMBER         --战队战斗失败次数
     MEMBER               VARCHAR2(20)   --成员,格式为sd2_userinfo.id:sd2_userinfo.id:
     DESCRIPTION          VARCHAR2(200)  --战队描述
问题描述:
  当删除sd2_userinfo中的一条记录时,相应的操作有,对表sd2_trade是delete from sd2_trade where owner=id,对sd2_troop分为三种情况
  1、当此人为队长时,删除该战队,并将战队中的其他成员的troopid置为0
  2、当此人为非队长,且该队成员数为2时,删除该战队,并将战队的队长的troopid置为0
  3、当此人为非队长,且该队成员数大于2时,将该战队的numbers-1,member中踢除“该队员的id:”
具体的代码:

create global temporary table sd2_userinfo_temp  --创建临时表
(
  id number
) on commit delete rows;

create or replace trigger tri_sd2userinfo_adr    --创建行级触发器
 after delete on sd2_userinfo
 referencing old as old new as new
 for each row
 begin
   insert into sd2_userinfo_temp values(:old.id);
 end;

create or replace trigger tri_sd2userinfo_ads    --创建语句级触发器
 after delete on sd2_userinfo
declare
   num number;
   mem varchar2(20);
   lea number;
   userid number;
 begin
   select id into userid from sd2_userinfo_temp;
   delete from sd2_trade where sd2_trade.owner=userid;  --删除他的交易记录
   select sd2_troop.leader,sd2_troop.numbers,sd2_troop.member into lea,num,mem from sd2_troop where sd2_troop.member like concat(userid,':%') or sd2_troop.member like concat(concat('%:',userid),':%');
   EXCEPTION
     WHEN NO_DATA_FOUND
     THEN
     RETURN;
   if(lea=userid) then  --当该用户为某队的队长时
     delete from sd2_troop where sd2_troop.leader=lea; --删除该战队
     update sd2_userinfo set sd2_userinfo.troopid=0 where mem like concat(sd2_userinfo.id,':%') or mem like concat(concat('%:',userid),':%');
   elsif(num=2)  then   --当用户为队员,且该队的成员数为2时
     delete from sd2_troop where sd2_troop.leader=lea; --删除该战队
     update sd2_userinfo set sd2_userinfo.troopid=0 where sd2_userinfo.id=lea;  --将该队的队长的troopid置为0
   elsif(num>2)  then   --当用户为队员,且该队的成员数大于2时
     update sd2_troop set sd2_troop.numbers=num-1,sd2_troop.member=replace(mem,concat(userid,':'),'') where sd2_troop.leader=lea;
   end if;
 end; 

分享到:
评论

相关推荐

    行级触发器不能读.txt

    在Oracle数据库中,行级触发器可以使用`:OLD`和`:NEW`伪记录来引用被修改前后的数据。然而,在某些特殊场景下,如当触发器在事务处理中被多次触发时,可能会遇到无法获取到预期数据的情况。 #### 2. 选择性限制 ...

    Oracle触发器修改自身表

    1、行级触发器不支持 ...所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据保存到 package中,然后在语句级触发期中调用 package包中保存的数据,进行更新操作

    关于oracle触发器before和after的应用问题

    本文旨在深入解析Oracle触发器中的Before和After两种触发时机,以及它们在数据库管理和维护中的具体应用。 #### 触发器概述 触发器类似于过程和函数,具有声明、执行和异常处理的部分,但其独特之处在于由特定事件...

    oracle_触发器的种类和触发事件

    触发器的执行顺序也需要考虑,包括语句级触发器和行级触发器的执行顺序。 触发器的应用场景非常广泛,包括数据的完整性、数据的安全性、业务逻辑的实现和数据库的初始化和关闭操作。触发器可以帮助数据库管理员和...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    2. 触发器中的高级特性:如BEFORE和AFTER触发器、FOR EACH ROW子句、多表触发器、自定义触发器函数等。 3. 存储过程的编写与调用:学习如何创建参数化存储过程、返回值的处理、游标的应用及异常处理机制。 4. 触发器...

    ORACLE中触发器和存储过程介绍相关代码

    这些示例将涵盖不同类型的触发器(如行级触发器和语句级触发器)以及各种存储过程的用法,包括输入输出参数、游标和异常处理等。通过实践,你将能够更好地理解Oracle数据库中触发器和存储过程的使用和优势,提升你的...

    oracle触发器执行顺序.pdf

    总结以上知识点,Oracle触发器的执行顺序和功能主要围绕着行级触发器和语句级触发器的概念展开,它们根据触发器定义的BEFORE或AFTER,以及DML操作发生前后的不同阶段执行。触发器可以包含复杂的逻辑判断,并在满足...

    oracle异常及触发器.pptx

    触发器可以分为两类:行级触发器和语句级触发器。行级触发器对每一行数据进行操作,而语句级触发器对整个语句进行操作。 在 Oracle 中,触发器可以用于实现业务逻辑、数据验证、数据安全和数据一致性等功能。例如,...

    Oracle触发器与存储过程高级编程

    行级触发器在每一行数据被操作时触发,而语句级触发器在整个操作完成后触发。行级触发器常用于逐行处理,而语句级触发器适用于全局操作。 3. **复合触发器** 复合触发器可以在一次操作中响应多个事件,比如在一个...

    oracleDML触发器.pptx

    在Oracle 10g中,DML触发器分为两种类型:行级触发器和语句级触发器。 1. 行级触发器:当DML操作影响单行或多行时,行级触发器会被触发一次。例如,对于UPDATE操作,如果更新了5行数据,行级触发器会执行5次。这...

    oracle 触发器方式实现行ID自增加

    在Oracle数据库系统中,行ID(也称为序列号或序列)是用于...在实际应用中,还可以考虑其他方法,如使用序列函数直接在插入语句中生成ID,或者使用数据库的内置特性如 identity column(在Oracle 12c及以上版本支持)。

    oracle触发器与存储过程高级编程

    触发器分为行级和语句级,行级触发器对每一行数据操作进行处理,而语句级触发器则在整个操作完成后执行一次。 1. **创建触发器** 创建触发器使用`CREATE TRIGGER`语句,需要指定触发器的名称、触发时机、触发条件...

    oracle练习题关于触发器的作业

    3. **复合触发器**:复合触发器允许在一个触发器中组合行级和语句级触发器的特性,这样可以在同一事件中处理多个操作。 4. **系统触发器**:Oracle还提供了一些预定义的系统触发器,这些触发器在特定的数据库事件上...

    oracle触发器详解

    行级触发器在每一行数据受到影响时触发,而语句级触发器则在整个SQL语句执行完毕后触发。定时触发器则通过DBMS_JOB或者DBMS_SCHEDULER等包来定时执行任务。 创建Oracle触发器的语法如下: ```sql CREATE TRIGGER ...

    oracle存储过程和触发器

    触发器分为两大类:行级触发器和语句级触发器。行级触发器针对每行数据的更改进行响应,而语句级触发器则对整个语句进行响应。触发器可以设定在事件发生之前(BEFORE)、之后(AFTER)执行,或者是在每个受影响的行...

    oracle 触发器

    ### Oracle 触发器:语句级触发器与行级触发器详解 #### 一、概念解析 在Oracle数据库管理中,触发器是一种特殊类型的存储过程,它可以在特定的数据库事件(如数据插入、更新或删除)发生时自动执行。触发器能够...

    oracle 数据库 触发器

    Oracle 数据库触发器是数据库管理系统中的一个重要特性,用于在特定事件发生时自动执行预定义的SQL语句或PL/SQL代码块。Oracle 9i版本引入了多种类型的触发器,这些触发器允许开发者实现复杂的业务逻辑和数据完整性...

    Oracle触发器与存储过程高级编程(chm)

    1. **类型**:Oracle支持三种类型的触发器——行级触发器(处理单个行)、语句级触发器(处理整个SQL语句)和复合触发器(结合了行级和语句级触发器的特性)。 2. **创建触发器**:使用CREATE TRIGGER语句定义...

Global site tag (gtag.js) - Google Analytics