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