2016-04-05 23 views
0

Benim istediğim: Her defaussee 1'e eşit olduğu zaman 0'a için bunları açmak istiyor İşteGüncelleme masa ve tetik

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

Ben kullanmak istiyorum Bunu yapmak için benim masam Pile'da tetikleyin. Ancak, masamı bu tetikleyiciye değiştiremediğimi biliyorum.

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; 

biri bana yardım edebilir: Burada

ben ne var?

Bu hata sadece UPDATE numaralı telefondan değil. Oracle ilk SELECT'dan bağırdı. Pile'daki bir tetikleme sırasında Pile okuduğum/yazdığım onu ​​istemiyor.

+0

Tetikleyicinizi "AFTER" yerine "ÖNCE GÜNCELLEŞTİRME" tetikleyicisine değiştirirseniz ne olur? Oracle, temelde sonsuz bir döngü oluşturduğunuzdan, onu güncelledikten sonra verileri işlemekten kurtarmanızı önler. –

+0

'if (: new.defaussee = 1) 'i kullanmayı deneyin: new.defaussee: = 0; eğer ise; –

cevap

0

Aşağıdakileri deneyebilir misiniz?

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'ın SQL düzeyinde, yalnızca PL/SQL'de bir boole türü yoktur. –

+0

Oracle olduğunu farketmedin, teşekkür ederim :) –