zoukankan      html  css  js  c++  java
  • 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关键字的时候还有对时间操作的时候。

  • 相关阅读:
    在CentOS中配置DNS服务器
    CENTOS5.3 64位 VNC远程控制Centos 安装配置
    Windows Server 2003 FTP服务器配置详解 20091210 14:23:36| 分类: 服务器 | 标签: |字号大
    Centos 5.1 sendmail邮件服务器安装及配置
    DNS安装配置全过程
    tomcat多域名设置
    tomcat6 优化初步
    让CentOS自动备份mysql数据库 不指定
    开通企业邮箱之前,请登录您企业网站的域名注册服务商的域名管理平台,进行DNS配置及指向设置,谢谢您的配合
    18.3.2 在不同主机上使用 RMAN 备份建立物理备用数据库
  • 原文地址:https://www.cnblogs.com/lvgo/p/13275874.html
Copyright © 2011-2022 走看看