Oracle触发器和MySQL触发器的简单应用

标签: oracle mysql 应用
90人阅读 评论(0) 收藏 举报
分类:

Oracle更新触发器

话不多说直接走一个

DROP TRIGGER kfzt_afterupdate_dlzt;
create or replace trigger kfzt_afterupdate_dlzt AFTER UPDATE ON jg_kfzt FOR EACH ROW
BEGIN
-- 更新 超时时间等于心跳时间加上30分钟;在线时间等于心跳时间减去登录时间的分钟数;
    UPDATE jg_dlzt
        SET cssj = :new.xtsj + INTERVAL '30' minute,
                zxsc = CEIL((TO_DATE(to_char(:new.xtsj,'yyyy-mm-dd hh24:mi:ss'), 'YYYY-MM-DD HH24-MI-SS') - TO_DATE(to_char(dlsj,'yyyy-mm-dd hh24:mi:ss') , 'YYYY-MM-DD HH24-MI-SS')) * 24*60  ),
                xtsj = :new.xtsj
  WHERE kfid = :new.kfid AND dlsj = (SELECT a.dlsj FROM (SELECT MAX(dlsj) AS dlsj FROM jg_dlzt where kfid = :new.kfid) a );
END;

这是我一段真实的业务触发器。实现操作是在 jg_kfzt 表更新后修改 jg_dlzt 表 cssj 字段的时间在Oracle中对时间的运算操作比较繁琐,直接用时间相减不能够实现需要的结果。所以这里对时间进行了先转成字符在转成时间在去运算

//需要注意的地方 where条件
WHERE kfid = :new.kfid AND dlsj = (SELECT a.dlsj FROM (SELECT MAX(dlsj) AS dlsj FROM jg_dlzt where kfid = :new.kfid) a );
//这里的 dlsj = 后面的子条件查询如果不用别名是会报错。原因是因为以自身的数据作为条件去修改自身这是违背常规的。所以起个别名就规避掉这个问题了

顺便简单提一下

//CEIL  向上取整。  1.1 = 2  1.9 = 2  -1.1 = -1  -1.9 = -1
//FLOOR 向下取整。  1.1 = 1  1.9 = 1  -1.1 = -2  -1.9 = -2
//ROUND 四舍五入。  1.1 = 1  1.9 = 2  -1.1 = -1  -1.9 = -2
//TRUNC 截取整数位. 1.1 = 1  1.9 = 1  -1.1 = -1  -1.9 = -1

mysql 时间操作

获取当前时间函数: now()
DATE_ADD("2011-11-20 12:22:30",INTERVAL 30 MINUTE) //参数时间增加30分钟

oracle 时间操作

获取当前时间函数:sysdate
//先将时间类型进行to_char格式转换
//再将其to_date转换。进行时间运算
CEIL((TO_DATE(to_char('数据库中时间字段','yyyy-mm-dd hh24:mi:ss'), 'YYYY-MM-DD HH24-MI-SS') - TO_DATE(to_char('数据库中时间字段','yyyy-mm-dd hh24:mi:ss') , 'YYYY-MM-DD HH24-MI-SS')) * 24*60  )

下面是同样需求的MySQL触发器

DROP TRIGGER IF EXISTS kfzt_afterupdate_dlzt;
CREATE TRIGGER kfzt_afterupdate_dlzt AFTER UPDATE ON jg_kfzt FOR EACH ROW
BEGIN
    -- 更新 超时时间等于心跳时间加上30分钟;在线时间等于心跳时间减去登录时间的分钟数;
    UPDATE jg_dlzt a SET cssj = DATE_ADD(new.xtsj,INTERVAL 30 MINUTE),zxsc = TIMESTAMPDIFF(Minute,a.dlsj,new.xtsj) WHERE a.kfid = new.kfid AND NOW() < a.cssj;
    END

需要注意的是:mysql和oracle中的语法稍有不同,需要特殊注意一下。比如在调用new关键字的时候还有对时间操作的时候。

查看评论

Oracle数据库开发之子程序(过程函数)和触发器视频课程

-
  • 1970年01月01日 08:00

【oracle学习】9.触发器以及应用场景

前言 先介绍一下我们下面要用到的两张表以及数据: 员工信息表 create table EMP( EMPNO NUMBER, ENAME VARCHAR2(10), JOB V...
  • u013517797
  • u013517797
  • 2016-09-11 14:20:55
  • 1579

Oracle触发器和MySQL触发器之间的区别

Oracle触发器格式: CREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table...
  • a19881029
  • a19881029
  • 2014-07-16 16:31:47
  • 4271

oracle自带的几个触发器(最简单触发器格式)

--create or replace trigger MDSYS.sdo_drop_userafter drop on DATABASEdeclare    stmt varchar2(200);B...
  • xjzdr
  • xjzdr
  • 2008-01-29 09:31:00
  • 954

mysql的触发器和oracle触发器的区别

mysql的trigger是仅仅statement激活,不能对同一table的同一个event写两个trigger, 同一个event是指create trigger 中的trigger_time+t...
  • u012069924
  • u012069924
  • 2014-04-24 11:34:19
  • 809

Oracle触发器简单实例

Oracle触发器的定义和使用
  • fullStackChenZF
  • fullStackChenZF
  • 2017-05-04 08:06:06
  • 625

触发器中OLD和NEW的使用

触发器中OLD和NEW的使用
  • weixin_38381681
  • weixin_38381681
  • 2017-06-12 15:57:05
  • 1538

mysql触发器的应用场景

1.规则编号的生成 CREATE     /*!50017 DEFINER = 'root'@'localhost' */     TRIGGER `tri_temp_no` BEFORE ...
  • jo7490
  • jo7490
  • 2016-12-16 16:22:28
  • 814

oracle 和mysql触发器的编写有什么不同。

oracle 和mysql触发器的编写有什么不同。
  • Q1059081877Q
  • Q1059081877Q
  • 2015-06-22 10:51:49
  • 613

mysql 触发器的详细用法

触发器 一类特殊的数据库程序,可以监视某种数据的操作(insert/update/delete),并触发相关的操作(insert/update/delete),保护数据的完整性 应用场景:数据同步...
  • yang1464657625
  • yang1464657625
  • 2017-03-05 11:11:09
  • 933
    个人资料
    持之以恒
    等级:
    访问量: 4716
    积分: 284
    排名: 27万+
    文章存档
    最新评论