IBM DB2在插入后创建触发器

问题描述:

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

我有3个表,看起来像这样:

  • 表阿诺德的列:“id”和“用”两个整数
  • 表伯特伦的列:“ID”整数和“名” VARCHAR
  • 与列的表康纳:“POS”,“arnoldid”,当一个新行插入到表“bertramid”所有的整数

现在我试着去创建一个触发器,它会自动将行插入表康纳伯特伦。 它必须获取新创建的bertram行的id,并插入所有使用设置为1的表arnold的行,并将它们的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,对于这个问题),但任何时候你正在使用CURSOR内SQL的,你平时做错了。

我相信(但没有测试过)应该有以下工作:

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