2011-12-04 33 views
1

我在嘗試爲我的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 

感謝您的幫助! :(

回答

1

我沒有做過了很多觸發編程(或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