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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值