Bonjour à tous,
Débutante sous oracle, un trigger me pose beaucoup de probleme. Je cherche à generer une facture automatiquement sous oracle à partir de l'entrée d'une reservation.


Le Voici :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
create or replace trigger trigger_creation_facture 
after insert or update on reservation
for each row
declare
 
 
IDFACTURE number;
Exist_deja number;
REMISE number;
FACTURETOTALE number;
 
DATEFACTURE date;
DATEDEPART date;
MOISDEPART varchar2(10);
 
TARIFADULTE number;
TARIFENFANT number;
NBADULTE number;
NBENFANT number;
 
FACTUREAVION number;
 
DUREE number;
TARIFCHS number;
TARIFCHD number;
TARIFLITSUP number;
NBCHS number;
NBCHD number;
NBLITS number;
CATEGORIEHOTEL number;
 
FACTUREHOTEL number;
 
TARIFCIRCUIT number;
 
NOM varchar2(20);
PRENOM varchar2(20);
ADRESSE varchar2(20);
TELEPHONE number;
 
BEGIN
 
FACTUREAVION:=0;
FACTUREHOTEL:=0;
FACTURETOTALE:=0;
REMISE:=0;
Exist_deja:=0;
 
IDFACTURE:= :NEW.ID_RESERVATION;
 
Select id_facturation into Exist_deja 
from facturation
where id_facturation=IDFACTURE;
 
If(Exist_deja<>0)then
Delete from facturation where id_facturation=Exist_deja;
end if;
 
DATEFACTURE:=CURRENT_DATE();
 
select nom,prenom,adresse,telephone into NOM,PRENOM,ADRESSE,TELEPHONE from client c,reservation r
where r.id_reservation=IDFACTURE and r.id_client=c.ID_CLIENT;
 
select datevol into DATEDEPART from vol v,reservation r 
where r.id_reservation=IDFACTURE AND r.id_vol=v.ID_VOL;
 
MOISDEPART:= TRUNC(DATEDEPART,'MM');
 
If(MOISDEPART<>'7' and MOISDEPART<>'8') then
REMISE:=10;
End if;
 
Select tarifadulte, tarifenfant into TARIFADULTE,TARIFENFANT from vol v,reservation r
where r.id_reservation=IDFACTURE and r.id_vol=v.ID_VOL;
 
Select  nbadulte, nbenfant, duree, nbchambresimple, nbchambredouble, nblitsup
into NBADULTE, NBENFANT,DUREE,NBCHS,NBCHD,NBLITS from RESERVATION r
where r.id_reservation=IDFACTURE;
 
Select 
prixchsimple, prixchdouble, prixlitsup into TARIFCHS,TARIFCHD,TARIFLITSUP from reservation r, circuit c,hotel h
where r.ID_RESERVATION=IDFACTURE and r.id_circuit=c.ID_CIRCUIT and c.id_etape1=h.id_etape;
 
Select prixcircuit into TARIFCIRCUIT from circuit c, reservation r  where r.ID_RESERVATION=IDFACTURE and r.id_circuit=c.ID_CIRCUIT;
 
FACTUREAVION:=NBADULTE*TARIFADULTE+NBENFANT*TARIFENFANT;
 
FACTUREHOTEL:=DUREE*(TARIFCHS*NBCHS+TARIFCHD*NBCHD+TARIFLITSUP*NBLITS);
 
FACTURETOTALE := (FACTUREAVION+FACTUREHOTEL+TARIFCIRCUIT)*(1-REMISE/100);
 
insert into FACTURATION (
id_facturation, datefacturation , favion, fhotel, facturetotale ,remise , nbadultef , nbenfantf , tarifadultevol, tarifenfantvol , nbchdoublef , nbchsimplef ,nblitsupf , tarifchdoublef , tarifchsimplef ,tariflitsupf ,tarifcircuitf, 
nomclient, prenomclient, adresseclientf, telephoneclientf, id_reservation) 
values
(IDFACTURE, DATEFACTURE, FACTUREAVION, FACTUREHOTEL, FACTURETOTALE, REMISE, 
NBADULTE,NBENFANT ,TARIFADULTE , TARIFENFANT,NBCHD ,NBCHS ,NBLITS , TARIFCHD, TARIFCHS, TARIFLITSUP, TARIFCIRCUIT , NOM ,PRENOM ,ADRESSE ,TELEPHONE, IDFACTURE) ;
 
UPDATE  reservation SET id_facturation=IDFACTURE;
END;
Erreur lors de l'enregistrement des modifications de la table
"MIAGE20"."RESERVATION" :
Ligne 1 : ORA-04091: la table MIAGE20.RESERVATION est en mutation ; le déclencheur ou la fonction ne peut la voir
ORA-06512: à "MIAGE20.TRIGGER_CREATION_FACTURE", ligne 47
ORA-04088: erreur lors d'exécution du déclencheur 'MIAGE20.TRIGGER_CREATION_FACTURE'
ORA-06512: à ligne 1