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

  • 相关阅读:
    CMD窗口正确显示UTF-8字符
    《剑指offer》 链表中倒数第k个节点
    《剑指offer》 调整数组顺序使得奇数在偶数前面
    《剑指offer》 大数递增
    《剑指offer》 数值的整数次方
    《剑指offer》 二进制中1的个数
    《剑指offer》 跳台阶
    《剑指offer》斐波那契数列
    《剑指offer》旋转数组中的最小数字
    刷《剑指offer》笔记
  • 原文地址:https://www.cnblogs.com/lvgo/p/13275874.html
Copyright © 2020-2023  润新知