2016-04-05 14 views
0

:すべてのdefausseeが1に等しいとき、私はここで0 にそれらを有効にしたい私のテーブルである更新テーブルとトリガー

create table Pile(
    id_carte Int NOT NULL, 
    id_pilecarte Int NOT NULL, 
    defaussee Int NOT NULL, 
    id_personne Int 
); 

私が使用することを行うにはPileのトリガー。 しかし私はテーブルをそのトリガに変更できないことを知っています。ここで

は私が持っているものです。

create or replace trigger trg_pile_porte_vide 
    after update 
    on Pile 
    for each row 

    declare 
     v_count Int; 
    begin 
     -- pile tresor 
     select count(*) into v_count from (select id_carte from Pile where id_pilecarte = 0 and defaussee = 0 and id_personne is null); 
     -- toutes les cartes sont defause 
     if(v_count = 0) then 
      update Pile set defaussee = 0 where id_pilecarte = 0; 
     end if; 

     -- pile tresor 
     select count(*) into v_count from (select id_carte from Pile where id_pilecarte = 1 and defaussee = 0 and id_personne is null); 
     -- toutes les cartes sont defause 
     if(v_count = 0) then 
      update Pile set defaussee = 0 where id_pilecarte = 1; 
     end if; 
    end; 

は、誰かが私を助けることができませんか?

エラーはUPDATEにあるだけではありません。 Oracleは最初のSELECTから怒鳴ります。彼は、Pileのトリガ中に私が読んだ/読んでいるのをPileにしたくない。

+0

トリガーを「AFTER」ではなく「BEFORE UPDATE」トリガーに変更するとどうなりますか? Oracleは、基本的に無限ループを作成しているため、更新後にデータを操作できないようにします。 –

+0

'if(:new.defaussee = 1)を使ってみてください:new.defaussee:= 0;終わりです。 –

答えて

0

あなたは次のことができますか?

UPDATE Pile 
SET defaussee = 0 
WHERE (id_pilecarte, 1) IN (
    SELECT id_pilecarte, MIN(defaussee) 
    FROM Pile 
    GROUP BY id_pilecarte 
    HAVING MIN(defaussee) = 1 
); 
+0

OracleにはSQLレベルでブール型がなく、PL/SQLでのみ使用されます。 –

+0

それはOracleだったことに気付かなかった、ありがとう:) –

関連する問題