查看: 2501|回复: 10

【讨论】求教语句级触发器

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-07-01 06:00:12
发表于 2014-11-4 14:42 | 显示全部楼层 |阅读模式
收到一个推送的结果表T1,里面会有jobid,groupid,result几个字段,我这里有一个控制任务的表T2,里面有groupid,result,如果T1表中同一个groupid全部完成,那么将T2中对应的groupid的result更新为SUC,不然就不去修改(默认是ERR),但是我写的语句级触发器,只要T1中有一组groupid全部都是完成的,那么就会把所有的T2中的记录全部更新为SUC,实在想不明白,代码如下
CREATE TABLE T1
(JOBID NUMBER,GROUPID NUMBER,RES CHAR(3));

CREATE TABLE T2 AS
SELECT 11 AS GROUPID,'ERR' AS RES FROM DUAL
UNION ALL
SELECT 22 ,'ERR' FROM DUAL;

CREATE OR REPLACE TRIGGER TRG1
AFTER INSERT ON T1
BEGIN
MERGE INTO T2
USING (SELECT T1.GROUPID,SUM(DECODE(T1.RES,'SUC',1,-1000)) FROM T1 GROUP BY T1.GROUPID
HAVING SUM(DECODE(T1.RES,'SUC',1,-1000)) >0) T1
ON T1.GROUPID = T2.GROUPID
WHEN MATCHED THEN
UPDATE SET T2.RES = 'SUC';
END;

TRUNCATE TABLE T1;

INSERT INTO T1 VALUES (1,11,'SUC');
INSERT INTO T1 VALUES (2,11,'SUC');
INSERT INTO T1 VALUES (3,22,'SUC');
INSERT INTO T1 VALUES (4,22,'ERR');

COMMIT;

SELECT * FROM T2;
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2014-11-4 15:12 | 显示全部楼层
改为如下就可以了

CREATE OR REPLACE TRIGGER TRG1
AFTER INSERT OR DELETE OR UPDATE on t1
BEGIN
  MERGE INTO T2
  USING (SELECT GROUPID,
                SUM(DECODE(RES, 'SUC', 0, 1)) flag
           FROM T1
          GROUP BY GROUPID) T1
  ON (T1.GROUPID = T2.GROUPID)
  WHEN MATCHED THEN
    UPDATE SET T2.RES = decode(T1.flag, 0, 'SUC', 'ERR');
END;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-01 06:00:12
 楼主| 发表于 2014-11-4 15:49 | 显示全部楼层
bell6248 发表于 2014-11-4 15:12
改为如下就可以了

CREATE OR REPLACE TRIGGER TRG1

这个不满足需求把,要一个group都是suc才能把T2弄成suc,而且这个上去也不对,整个T2都是suc,应该只有T1suc才对

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2014-11-4 16:04 来自手机 | 显示全部楼层
feifeitiao 发表于 2014-11-4 15:49
这个不满足需求把,要一个group都是suc才能把T2弄成suc,而且这个上去也不对,整个T2都是suc,应该只有T1s ...

你测试了吗?  我这里测试过没有问题

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-01 06:00:12
 楼主| 发表于 2014-11-4 16:11 | 显示全部楼层
bell6248 发表于 2014-11-4 16:04
你测试了吗?  我这里测试过没有问题

我试了,都变了,我原来那个也是,都变成suc了,但是22GROUP是不应该变得,应该还是ERR

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2014-11-4 16:27 来自手机 | 显示全部楼层
feifeitiao 发表于 2014-11-4 16:11
我试了,都变了,我原来那个也是,都变成suc了,但是22GROUP是不应该变得,应该还是ERR

我贴出的trigger,我测试没有问题, 最后11是SUC, 22是ERR, ,

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-01 06:00:12
 楼主| 发表于 2014-11-4 17:07 | 显示全部楼层
本帖最后由 feifeitiao 于 2014-11-4 17:10 编辑

你的确实是对的,刚才我搞错了,但是我的为什么就会错呢,我没找到原因啊,我的单独执行merge是没错的。。
我们的区别是你的using里group1122都有,我的就只有一条,那么我的为什么会更新两条记录呢?

使用道具 举报

回复
论坛徽章:
13
奥迪
日期:2013-10-12 11:06:54狮子座
日期:2015-08-08 19:02:44沸羊羊
日期:2015-04-30 16:38:382015年新春福章
日期:2015-03-06 11:58:39慢羊羊
日期:2015-03-04 14:53:33优秀写手
日期:2015-02-12 06:00:14优秀写手
日期:2015-01-28 06:00:13马上有对象
日期:2014-10-29 13:15:17马上有房
日期:2014-10-26 16:16:04问答徽章
日期:2013-10-15 23:55:50
发表于 2014-11-4 20:07 | 显示全部楼层
HAVING SUM(DECODE(RES,'SUC',1,-1000))>1)

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-11-4 21:40 | 显示全部楼层
feifeitiao 发表于 2014-11-4 17:07
你的确实是对的,刚才我搞错了,但是我的为什么就会错呢,我没找到原因啊,我的单独执行merge是没错的。。
我们 ...

代码的区别就是正确和错误的地方

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2014-11-4 23:55 | 显示全部楼层
bell6248 发表于 2014-11-4 16:04
你测试了吗?  我这里测试过没有问题

奇怪,你在手机上怎么测的?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

点击报名>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表