2011-03-07 19 views
3

フィールドの入力値をチェックし、フィールドがNULLの場合は別の行の同じフィールドに置き換えるBEFORE INSERTトリガーを作成しようとしています。しかし、私がCALLステートメントをトリガーに追加すると、エラー "The trigger "ORGSTRUCT.CSTCNTR_IN" is defined with an unsupported triggered SQL statement"が返されます。ドキュメントをチェックして、カーソルがBEFORE(最初にストアドプロシージャを作成する理由の一部)でサポートされていないことを確認しましたが、ストアドプロシージャからカーソル宣言を削除しても、 。ストアド・プロシージャ・コール(DB2 LUW 9.5)を使用したINSERTトリガー

トリガー:

CREATE TRIGGER orgstruct.cstcntr_IN 
     NO CASCADE 
     BEFORE INSERT ON orgstruct.tOrgs 
     REFERENCING NEW AS r 
     FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC 
    DECLARE prnt_temp BIGINT; 
    DECLARE cstcntr_temp CHAR(11); 

    SET prnt_temp = r.prnt; 
    SET cstcntr_temp = r.cstcntr; 

    CALL orgstruct.trspGetPrntCstCntr(prnt_temp,cstcntr_temp); 
    SET r.cstcntr = cstcntr_temp; 
END 

ストアドプロシージャ:

CREATE PROCEDURE orgstruct.trspGetPrntCstCntr (
    IN p_prnt    BIGINT, 
    OUT p_cstcntr  CHAR(11) 
) 
SPECIFIC trGetPrntCstCntr 
BEGIN 
    IF p_prnt IS NULL THEN 
     RETURN; 
    END IF; 

    BEGIN 
     DECLARE c1 CURSOR 
      FOR 
       SELECT cstcntr 
       FROM orgstruct.tOrgs 
       WHERE id = p_prnt 
      FOR READ ONLY; 
     OPEN c1; 
     FETCH FROM c1 INTO p_cstcntr; 
     CLOSE c1; 
    END; 
END 

文書によると、CALLBEFOREトリガーで許可されているので、私は問題が何であるかを理解していません。トリガ前

答えて

2

Aは、ストアドプロシージャを呼び出すことができますが、ストアドプロシージャ、トリガでは許可されていない何もすることができません。あなたのケースでは

は、SQLストアドプロシージャのデータアクセスのデフォルトのレベルはトリガーでは許可されていないMODIFIES SQL DATA、です。ストアドプロシージャを再作成し、データアクセスレベルをREADS SQL DATAに変更することができます。トリガーを作成することができます。

ただし、ストアドプロシージャをこのような単純なもので呼び出す理由はありません。あなたは、単純なインライン・トリガーを使用してそれを行うことができます。

create trigger orgstruct.cstcntr_IN 
    no cascade 
    before insert on orgstruct.tOrgs 
    referencing new as r 
    for each row 
    mode db2sql 
    set r.cstcntr = case 
        when r.p_prnt is not null 
         then (select cstcntr from tOrgs where id = r.p_prnt fetch first 1 row only) 
        else r.cstcntr 
        end; 

それはストアドプロシージャ内でストアドプロシージャ呼び出しとカーソル処理の両方を排除ので、これはLOTより効率的になります。ストアドプロシージャを使用したい場合でも、ストアドプロシージャ内のカーソルを削除してパフォーマンスを向上させることができます。

はFYI:あなたが投稿論理は誤りが含まれており、常にNULLにCSTCNTRを設定します。この答えに投稿されたトリガーはこれをしません。 :-)

関連する問題