插入后的IBM DB2 Create Trigger

时间:2011-12-04 22:04:15

标签: sql triggers db2

我在尝试为db2数据库创建触发器时遇到问题。 这是我第一次尝试使用触发器,所以请原谅我的愚蠢。

我有3张表,如下所示:

  • 表arnold with columns:“id”和“use”都是整数
  • 表bertram with columns:“id”integer和“name”varchar
  • 表connor with columns:“pos”,“arnoldid”,“bertramid”all integer

现在我试图创建一个触发器,当一个新行插入到表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

感谢您的帮助!!! :(

1 个答案:

答案 0 :(得分:1)

我没有做过很多触发器编程(或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