Si vous avez 11g ou 12c, vous pouvez écrire un déclencheur composé. Il comporte une section qui s'exécute avant le début de l'activité de déclenchement réelle. C'est-à-dire que vous pouvez lire à partir du tableau de cette section car c'est avant que le tableau n'entre dans un état de mutation :
create or replace trigger Predmety_Ciu
For Insert Or Update On Predmety
Compound Trigger
MaxID int;
Before Statement Is Begin
-- Be prepared this might be the first record written to the table
select nvl( max( ID ), 0 ) into MaxID from Predmety;
End Before Statement;
Before Each Row Is Begin
IF :NEW.ID = :NEW.NAVAZUJE_NA THEN --There is an error (PLS-00405)
Raise_Application_Error(-20000, 'Predmet nemuze navazovat sam na sebe.', False);
Elsif :New.Navazuje_Na > Maxid Then
Raise_Application_Error(-20001, 'Predmet nemuze navazovat na neexistujici predmet. Další objekt ID: ' || to_char( Maxid ), False);
Elsif :New.Id < 0 Or :New.Navazuje_Na < 0 Then
Raise_Application_Error(-20002, 'Neplatny index predmetu nebo predmetu, na ktery ma dany predmet navazovat.', False);
End If;
End Before Each Row;
After Each Row Is Begin
-- Vložte nějaký kód, který chcete spustit po vložení řádku
If Inserting Then
Maxid := Maxid + 1;
end if;
End After Each Row;
After Statement Is Begin
Null; -- Vložte nejaký kód, který chcete spustit po zadání všech rádek.
End After Statement;
End Predmety_Ciu;
J'ai supprimé le gestionnaire d'exceptions car je voulais les exceptions.