繁体   English   中英

插入后IBM DB2创建触发器

[英]IBM DB2 Create Trigger after insert

我在尝试为我的db2数据库创建触发器时遇到了麻烦。 这是我第一次尝试使用触发器,因此请原谅我的愚蠢行为。

我有3张桌子,看起来像这样:

  • 表arnold的列:“ id”和“ use”均为整数
  • 表bertram,其列为:“ id”整数和“ name” varchar
  • 表connor的列:“ pos”,“ arnoldid”,“ bertramid”所有整数

现在我正在尝试创建一个触发器,当将新行插入表bertram中时,该触发器将自动将行插入表connor中。 它必须获取新创建的bertram行的ID,并将表arnold的所有行(其中use设置为1)插入,并将其ID放入connor行的相应arnoldid列中。 所有这些connor行中的pos列也必须从1编号到新行的编号。

我走了这么远,但是我认为这是非常错误的:

CREATE TRIGGER usage AFTER INSERT ON bertram REFERENCING NEW AS newbert FOR EACH ROW
BEGIN ATOMIC
    SET newpos = 1;
    FOR looop AS mycursor CURSOR FOR SELECT * FROM arnold WHERE (use = 1) DO
        INSERT INTO connor (pos, bertramid, arnoldid) 
                    VALUES (newpos, newbert.id, mycursor.id);
        SET newpos = newpos +1;
    END FOR;
END

谢谢你的帮助!!! :(

我没有做过很多触发器编程(就此而言,还是UDF),但是任何时候 SQL 内部使用CURSOR时,通常都做错了。

我相信(但尚未测试)以下方法可以工作:

CREATE TRIGGER usage AFTER INSERT ON Bertram REFERENCING NEW ROW AS Newbert 
FOR EACH ROW MODE DB2ROW
BEGIN ATOMIC

INSERT INTO Connor(bertramId, arnoldId, pos)  -- elements reordered for clarity
SELECT newbert.id, a.id, (SELECT COUNT(b.id)
                          FROM Arnold as b
                          WHERE b.use = 1
                          AND b.id < a.id)
FROM Arnold as a
WHERE a.use = 1;
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM