Bonjour à tous , mon problème est assez complexe.
J'ai une table SEJOUR avec un booléen "Terminé" , si celui-ci passe à vrai alors un triggers se déclenche et je remplit une ligne facture d'une table FACTURE.

Voici la structure du trigger, je vous explique mon problème ensuite ... :

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
 
 
/* CREATION DES VUES PERMETTANT DE REMONTER LES SEJOURS ET LES ACTIVITES DONT LES FACTURES N'ONT PAS ETE REGLES
 
--VUE QUI REMONTE LES DONNEES NECESSAIRE A LA FACTURATION DE LA LOCATION DES SEJOURS NON TERMINES
 
DROP VIEW vue_periodes_sejour;
 
CREATE VIEW vue_periodes_sejour AS
  SELECT s.sej_num,e.emp_desc ,ps.per_sej_nbjours , ps.per_sej_nbpers , ps.per_sej_nbenfants , te.typ_emp_tarif_jour 
  FROM PERIODES_SEJOUR ps,SEJOUR s,EMPLACEMENT e, TYPE_EMPLACEMENT te 
  WHERE ps.sej_num=s.sej_num
  AND e.emp_num=s.emp_num
  AND te.typ_emp_code=e.typ_emp_code
  AND s.sej_est_termine=0;
  
 
--VUE QUI REMONTE LES DONNEES NECESSAIRE A LA FACTURATION DES ACTIVITES
DROP VIEW vue_activites_sejour;
 
CREATE VIEW vue_activites_sejour AS
  SELECT s.sej_num, pa.dat_act_num, aa.act_intitule, aa.act_ut , pa.par_act_nb_unites,aa.act_prixUT
  FROM SEJOUR s , participe_activite pa,ACTIVITE aa
  WHERE s.sej_num= pa.sej_num
  AND pa.act_num= aa.act_num
  AND s.sej_est_termine=0
  AND pa.par_act_regle=0;
  
 
CREATE OR REPLACE
TRIGGER Facturation
 
AFTER UPDATE OF sej_est_termine ON SEJOUR
 
FOR EACH ROW
 
DECLARE
--Montant du séjour pour l'attribut sej_montant de la table SEJOUR
  montant_sejour sejour.sej_montant%type;
--Montant des activités qui figurera sur la facture
  montant_activites sejour.sej_montant%type;
--Montant total fact_montant de la table FACTURE
  montant_total facture.fac_montant%type;
--numéro facture , concatenation date_jour+num_estivant  
  date_raccourcie VARCHAR2(12) ;
  
  --Numéro du séjour qui a été modifié
  numero_sej SEJOUR.SEJ_NUM%type := :NEW.sej_num;
  
 
CURSOR periodes_sejour IS
SELECT * FROM VUE_PERIODES_SEJOUR WHERE SEJ_NUM=numero_sej ;
 
CURSOR activites_sejour IS
SELECT * FROM VUE_ACTIVITES_SEJOUR WHERE SEJ_NUM=numero_sej ;
 
BEGIN
 
montant_sejour :=0;
montant_activites :=0;
montant_total:=0;
 
    OPEN periodes_sejour;
    FOR une_periode in periodes_sejour LOOP
    
    
      montant_sejour:=montant_sejour +     une_periode.per_sej_nbpers*une_periode.per_sej_nbenfants*une_periode.typ_emp_tarif_jour;
     
    END LOOP; 
    CLOSE periodes_sejour;
    
   
    IF (activites_sejour%ROWCOUNT>0) THEN
    
      FOR une_activite in activites_sejour LOOP
    
        montant_activites:=montant_activites+ une_activite.PAR_ACT_NB_UNITES+une_activite.ACT_PRIXUT;
      
      END LOOP; 
      
    END IF;
   
    montant_total := montant_sejour + montant_activites;
    
    SELECT to_char(sysdate,'DDMMYYYY') INTO date_raccourcie FROM DUAL ;
    
    INSERT INTO FACTURE VALUES ((date_raccourcie || to_char(:NEW.sej_num)),sysdate,montant_total,0);
  
END;
Mon problème est en faite que j'ai des curseurs qui me remontent les lignes ( à partir de deux vues ) qui correspondent au séjour que j'ai modifié et qui a déclenché le trigger.

Puis je fais des traitements sur ces deux curseurs.

J'ai mis en commentaires plusieurs parties de codes , et j'ai fais différents test.

Mon curseur fait la bonne sélection sur les vues.
Mais au moment de l'utilisation des curseurs pour mes calculs de montant , j'ai l'erreur suivante :
Row 1: ORA-04091: la table TAMARIS.SEJOUR est en mutation ; le déclencheur ou la fonction ne peut la voir.

Si j'ai bien comprit mes vue font des jointures sur la table qui est en modification et qui a déclenché le trigger et c'est impossible !

Or c'est un update , donc aucune suppression , ni ajout de ligne) et qui plus est , un after update , donc je fais mes traitements après avoir fait un update sur une table , donc pourquoi est elle encore en utilisation ?...

J'ai déjà été voir ce site :
http://sgbd.developpez.com/oracle/ora-04091/

Je pense passer par une table temporaire puis declencher un second trigger sur cette table temporaire , mais avant j'aimerais savoir si quelqu'un à une solution plus simple , car ma solution est assez lourde ...