0 0

oracle数据库触发器监听删除,可是为什么批量删除时,触发器时而起作用时而不起作用呢?0

一、涉及三张表(csp_nowinmine、csp_overtimehisalarm 、csp_overtimealarm )

二、问题:删除监听时而起作用时而不起作用,在PL/SQL中的sql window里测试删除语句是没问题的,但是java代码批量插入数据时则会出现此题

二、代码:

create or replace trigger nowinmine_triggers
  after insert or update or delete on csp_nowinmine 
  for each row
declare
  --本地变量定义
  orgNametemp            varchar2(50);--存储新的机构名称
  oldorgNametemp         varchar2(50);--存储旧的机构名称
  coalNametemp           varchar2(50);--存储新的煤矿名称
  oldcoalNametemp        varchar2(50);--存储旧的煤矿名称
  addresstemp            varchar2(100);--存储新的传感器位置
  overtimetemp           number(10,2);--存储新的矿工持续在井时间
  oldovertime            number(10,2);--存储旧的矿工持续在井时间
  isAlarmtemp            number(2);   --存储之前告警数目
  currenttime            varchar2(30);--当前时间
  newminercardcode       varchar2(15);--新的矿工卡号
  oldminercardcode       varchar2(15);--新的矿工卡号
  newsensorcode          varchar2(20);--新的传感器编码
  oldsensorcode          varchar2(20);--新的传感器编码
begin
  case 
    --当触发删除时
    when deleting then
      select o.orgname into oldorgNametemp from csp_org o where o.code = :old.orgcode;
      select c.name into oldcoalNametemp from csp_coalmineinfo c where
        c.id = :old.orgcode || '_' || :old.coalcode;       
      currenttime := to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
      oldminercardcode := :old.minercardcode;
      oldsensorcode := :old.sensorcode;
      dbms_output.put_line(oldminercardcode);
           
      delete from csp_overtimealarm ot where ot.orgname = oldorgNametemp and ot.coalname = oldcoalNametemp and
        ot.minercardcode = oldminercardcode;
      update csp_overtimehisalarm oth set oth.alarmflag = 0, oth.endtime = currenttime
          where oth.orgname = oldorgNametemp and oth.coalname = oldcoalNametemp and
            oth.minercardcode = oldminercardcode and oth.alarmflag = 1 and oth.sensorcode = oldsensorcode;

    --当触发插入或者更新时
    when inserting or updating then
      --得到机构名称. 煤矿名称. 传感器位置信息. 矿工持续在井时间
      select o.orgname into orgNametemp from csp_org o where o.code = :new.orgcode;
      select c.name into coalNametemp from csp_coalmineinfo c where c.id = :new.orgcode || '_' || :new.coalcode;
      select l.address into addresstemp from csp_locsensorinfo l
        where l.id = :new.orgcode || '_' || :new.coalcode || '_' || :new.sensorcode;
      newminercardcode := :new.minercardcode;
      newsensorcode := :new.sensorcode;
     
      overtimetemp := round((To_date(:new.updatetime, 'yyyy-mm-dd hh24:mi:ss') - To_date(:new.inminetime, 'yyyy-mm-dd hh24:mi:ss')) * 24,2);
 
      --查询之前告警数目
      select count(*) alarmtemp into isAlarmtemp from csp_overtimehisalarm oth
        where oth.orgname = orgNametemp and oth.coalname = coalNametemp and
          oth.minercardcode = newminercardcode and oth.alarmflag = 1 and oth.sensorcode = newsensorcode;
      --如果之前告警数目为0
      if (isAlarmtemp = 0) then
        --将此条数据插入实现告警表
        insert into csp_overtimealarm(orgName,coalName,sensorcode,minercardcode,address,overtime,starttime,alarmflag)
        values(orgNametemp,coalNametemp,newsensorcode,newminercardcode,addresstemp,overtimetemp,:new.updatetime,1);
        --将此条数据插入历史告警表
        insert into csp_overtimehisalarm(orgName,coalName,sensorcode,minercardcode,address,overtime,starttime,alarmflag)
        values(orgNametemp,coalNametemp,newsensorcode,newminercardcode,addresstemp,overtimetemp,:new.updatetime,1);
      --如果之前告警数目不为0
      else
        --将之前的持续在井时间存储到oldovertime中
        select ot.overtime into oldovertime from csp_overtimealarm ot
          where ot.orgname = orgNametemp and ot.coalname = coalNametemp and
            ot.minercardcode = newminercardcode and ot.alarmflag = 1 and ot.sensorcode = newsensorcode;
        --如果持续在井时间改变
        if(overtimetemp != oldovertime) then
          --恢复之前表中该矿工的告警
          update csp_overtimehisalarm oth set oth.alarmflag = 0, oth.endtime = :new.updatetime
            where oth.orgname = orgNametemp and oth.coalname = coalNametemp and
              oth.minercardcode = newminercardcode and oth.alarmflag = 1 and oth.sensorcode = newsensorcode;
          --插入新的告警
          insert into csp_overtimehisalarm(orgName,coalName,sensorcode,minercardcode,address,overtime,starttime,alarmflag)
            values(orgNametemp,coalNametemp,newsensorcode,newminercardcode,addresstemp,overtimetemp,:new.updatetime,1);
          --更新实时告警表中该矿工的告警
          update csp_overtimealarm ot set ot.starttime = :new.updatetime, ot.overtime = overtimetemp
            where ot.orgname = orgNametemp and ot.coalname = coalNametemp and
              ot.minercardcode = newminercardcode and ot.alarmflag = 1 and ot.sensorcode = newsensorcode;
        end if;
      end if;
    end case; 
end nowinmine_triggers; 

2013年5月14日 10:44
目前还没有答案

相关推荐

    oracle数据库触发器实例

    在Oracle数据库中,触发器是一种存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器可以用于执行复杂的业务逻辑或者数据完整性检查等操作。本文将通过三个具体的例子来展示如何创建和...

    利用 Oracle 系统触发器防止误删除表操作

    ### 利用Oracle系统触发器防止误删除表操作 #### 背景介绍 在企业级应用中,数据库的安全性和稳定性至关重要。Oracle作为一款广泛使用的数据库管理系统,提供了丰富的功能来保障数据安全。其中,系统触发器是Oracle...

    oracle Socket监听数据库推送信息

    在Oracle数据库环境中,实现Socket监听数据库推送信息是一种实时获取数据变化的方法。这通常涉及到数据库触发器、存储过程以及Java编程的结合使用。以下是对这个主题的详细解释: 1. **Oracle触发器**: - 触发器...

    oracle触发器的创建与使用

    【Oracle触发器的创建与使用】是数据库管理中不可或缺的一部分,尤其在Oracle数据库系统中,触发器扮演着关键角色。触发器是一种存储过程,当特定的数据库事件发生时(如INSERT、UPDATE或DELETE操作),它会被自动...

    oracle 数据库 触发器

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

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

    "oracle触发器的种类和触发事件" Oracle触发器是一种特殊的存储过程,它可以在数据库中自动执行一些操作,主要用于实现数据的...只有正确地创建和使用触发器,才能真正发挥触发器的作用,提高数据库的安全性和可靠性。

    oracle 触发器实时调用java 中http接口

    在Oracle数据库中,触发器是一种特殊类型的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。在这个场景中,我们关注的是一个特定的触发器,它在插入数据后被调用,并通过存储过程来...

    调试oracle触发器方法

    在Oracle数据库中,触发器(Triggers)是一种存储过程,它们自动执行,当特定的数据库事件发生时,如INSERT、UPDATE或DELETE操作。调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的...

    数据库oracle触发器课件

    触发器(Trigger)是Oracle数据库中一种预定义的PL/SQL程序,它会在特定的数据库事件(如INSERT、UPDATE、DELETE)发生时自动执行。触发器主要用于实现业务规则、数据完整性检查和审计等需求。创建DML触发器时,...

    Oracle Form 触发器的执行顺序

    Oracle Form 触发器的执行顺序 Oracle Form 是 Oracle E-Business Suite R12 中的一个功能强大且灵活的开发工具,用于创建复杂的商业应用程序。其中,触发器(Trigger)是一种非常重要的组件,它可以根据不同的事件...

    大型数据库触发器介绍

    例如,通过触发器可以实现在数据插入、更新或删除时触发的额外检查、更新关联数据或者记录审计日志等操作,从而增强数据库的完整性和一致性。在设计数据库应用时,合理利用触发器能够有效地提升系统的稳定性和功能。

    Orcal 数据库触发器文件

    Oracle数据库触发器是数据库管理系统中的一种重要特性,它允许开发者在特定的数据操作(如INSERT、UPDATE、DELETE)之前或之后执行自定义的SQL代码或PL/SQL块。这些代码可以用来实现业务规则、数据验证、审计跟踪等...

    Oracle数据库创建存储过程和触发器

    Oracle 数据库创建存储过程和触发器 Oracle 数据库创建存储过程和触发器是高级数据库开发设计的重要组成部分。存储过程和触发器是一种特殊类型的数据库对象,它们可以实现复杂的业务逻辑和数据处理操作。 存储过程...

    oracle快速批量生成表和触发器和序列.zip

    在Oracle数据库管理中,批量生成表、触发器和序列是一项常见的任务,特别是在系统初始化或数据迁移时。这个压缩包文件“oracle快速批量生成表和触发器和序列.zip”显然是为了帮助用户快速完成这类操作。下面将详细...

    Oracle触发器语法详解

    Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器可以基于数据库的值使用户具有操作数据库的某种权利,基于...

    Oracle中通过触发器来追踪用户的活动

    Oracle从Oracle8i开始引入了一类特殊触发器,它们不再局限于传统的DML事件,而是扩展到了系统级别,包括数据库启动触发器、DDL触发器和用户登录/注销触发器。这些触发器为数据库审计提供了新途径,特别是用户登录/...

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

    ### Oracle触发器Before和After应用详解 #### 引言 Oracle数据库系统中,触发器是一项核心功能,用于响应特定事件的自动执行代码块。本文旨在深入解析Oracle触发器中的Before和After两种触发时机,以及它们在...

    Oracle触发器修改自身表

    1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...

Global site tag (gtag.js) - Google Analytics