2016-04-21 4 views
0

私は、テーブルが更新されたときに実行されるトリガを持っています。トリガは別のテーブルを更新します。私は2番目のテーブルの変更を表示したいと思います。トリガーが1つのテーブルで実行された後、別のテーブルの列の値を表示できますか? (PL/SQL)

これは私が持っているコードです:私はトリガーが適切な技術ソリューションであるとは思わない

create or replace trigger update_club_fee 
after update of fee on sporting_clubs 
for each row 

begin 

update club_membership set amount = (duration*:new.fee) where :old.club_id = :new.club_id; 

dbms_output.put_line('Customer id is: '||:new.customer_id); 
dbms_output.put_line('Previous amount was '||:old.amount); 
dbms_output.put_line('New amount is '||:new.amount); 
end; 
+0

あなたはテーブル名を指定することは難しいだろうか? 'another table'、' first table'、 'a table'の代わりに? –

答えて

0

。クラブメンバーシップの変更をキャプチャするUIコードは、変更を子テーブルに伝達し、レポートを提供する必要があります。

しかし、あなたが本当にトリガーを使用する必要がある場合、かなりそのように可能であることを行っていない:

  1. あなたが参照できません:古い:CLUB_MEMBERSHIP上の新しい - これらは、トリガーのにのみ関連 レコードです所有テーブル (この場合はSPORTING_CLUBS)。 :old.amountは解決されません
  2. SPORTING_CLUBSの1つの行を更新すると、CLUB_MEMBERSHIP(各クラブには の権利がありますか?私はあなたが各行について知りたいと思うと仮定します。

私はclub_idと手数料を受け入れる手続きを書いています。これにより、CLUB_MEMBERSHIP内の関連するすべての行が更新され、更新された行がレポートされます。次に、この手順をトリガーから呼び出します。

ただし、トリガーは使用しないでください。

0

私はトリガーの使用についてクリスチャン・パーマーに同意しますが、時にはトリガが顧客からの要件です(はい、私の顧客からこの要件がありました!)、このようにしなければなりません。さらに、トリガ内にプロシージャコールを追加することは常に可能ではありません(プロシージャがトランザクション内で変更されたテーブルを参照する場合は、エラーが発生します)。

そのような場合には可能な解決策は、すべてのメンバーにループするためにカーソルを使用して、次のとおりである:

CREATE OR REPLACE TRIGGER UPDATE_CLUB_FEE 
AFTER UPDATE OF FEE ON SPORTING_CLUBS 
FOR EACH ROW 

BEGIN 

    FOR c IN (
     SELECT * 
     FROM club_membership 
     WHERE club_id = :old.club_id 
    ) LOOP 
     dbms_output.put_line('Customer id is: '  || c.customer_id); 
     dbms_output.put_line('Previous amount was ' || c.amount); 
     dbms_output.put_line('New amount is '  || c.duration * :new.fee); 
    END LOOP; 

    UPDATE club_membership 
    SET amount = duration * :new.fee 
    WHERE club_id = :old.club_id; 

END; 
関連する問題