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

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关键字的时候还有对时间操作的时候。

原文地址:https://www.cnblogs.com/lvgo/p/13275874.html