2011-12-04 13 views
1

私のdb2データベースのトリガーを作成しようとしています。 トリガーを使用しようとするのは初めてです。私の愚かさを許してください。挿入後にIBM DB2 Createトリガー

私はこのように見える3つのテーブルがあります。

  • 列を持つテーブルアーノルド:列の「ID」と「使用」の両方の整数
  • テーブルバートラム:「ID」整数と「名前」VARCHARを列を持つ
  • テーブルコナー:「POS」、「arnoldid」は、すべての整数

は今、新しい行がテーブルに挿入されたときに自動的にテーブルコナーに行を挿入しますトリガを作成しようとしているイム「bertramid」バートラム。 新しく作成されたバートラム行のIDを取得し、useが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)トリガプログラミングの多くを行っていないが、いつでもあなたは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