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