Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2011, 11h14   #1
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Par défaut trigger et table mutante

Bonjour,
J'ai un souci de table mutante dans mon trigger.
J'ai compris dans d'autres discussions que c'était dû au fait que je faisais appel à ma table depuis laquelle mon trigger était lancé or je ne vois pas comment faire autrement.
Explication :
J'ai la table A qui contient une année et un montant
table A
Annee montant
2010 10
2009 15
2008 24

selon l'année et le montant je vais remplir une table B avec une tranche pour l'année surlaquelle je travaille et sur l'année N-1
table B
Annee trancheAnneeN trancheAnneeN-1
2010 1 1
2009 1 2
2008 1 0


Dans mon trigger je vais donc chercher la valeur de l'année précédente pour pouvoir remplir ma TrancheAnneeN-1

Cela est-il faisable?

Cordialement
Merci d'avance pour votre aide
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 11h17   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Un petit bout de code pour illustrer et ce sera parfait !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 11h29   #3
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Plusieurs solutions pour la table mutante : ORA-04091

1) Ne pas utiliser de trigger, mais une procedure PL/SQL
2) mettre le trigger sur l'evenement AFTER pour passer après la transaction en conflit
3) utiliser autonomous transactions

et d'autres surement ...

EDIT : Appeler le professeur Xavier
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 22/11/2011, 11h31   #4
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Désolé, le voici.
Code :
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
CREATE OR REPLACE TRIGGER "TRG_ANNEE_I" BEFORE
UPDATE
OF "ANNEE_I", "MNT", "ag" ON "AG_ANNEE_I" FOR EACH ROW 
DECLARE 
     nT1  		ag_ex_t.NUM_T%type;
     nT2  		ag_ex_t.NUM_T%type;
     Im  		ag_annee_i.Ip%type;
BEGIN
--
	SELECT mnt INTO Im
	FROM Ag_annee_i
	WHERE Annee_i=(:NEW.ANNEE_I - 1)
		AND ag=:NEW.AG
		AND rownum=1;
	SELECT num_t INTO nT2
	FROM tr_i
	WHERE Im BETWEEN MNT1 AND MNT2
		AND ex = (:NEW.ANNEE_I + 1)
		AND rownum=1;
	SELECT num_t INTO nT2
	FROM tr_i
	WHERE Im BETWEEN MNT1 AND MNT2
		AND ex = (:NEW.ANNEE_I + 2)
		AND rownum=1;
    UPDATE ag_ex_t
    SET num_t=nT1,num_t2=nT2
    WHERE ex=:new.annee_i+2
	AND agent=:new.ag;
end;
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 11h52   #5
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
En posant le problème et en lisant vos réponses, j'ai trouvé la solution.
Pour cela j'ai remplacé tout bêtement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
	SELECT mnt INTO Im
	FROM Ag_annee_i
	WHERE Annee_i=(:NEW.ANNEE_I - 1)
		AND ag=:NEW.AG
		AND rownum=1;
	SELECT num_t INTO nT2
	FROM tr_i
	WHERE Im BETWEEN MNT1 AND MNT2
		AND ex = (:NEW.ANNEE_I + 1)
		AND rownum=1;
	SELECT num_t INTO nT2
	FROM tr_i
	WHERE Im BETWEEN MNT1 AND MNT2
		AND ex = (:NEW.ANNEE_I + 2)
		AND rownum=1;
par
Code :
1
2
3
SELECT num_t INTO nT2
	FROM ag_ex_t
	WHERE ex = (:NEW.ANNEE_I+1);
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h11.


 
 
 
 
Partenaires

Hébergement Web