Faire un trigger avec une sous-requête

Fermé
cixion - 22 oct. 2012 à 17:39
 cixion - 23 oct. 2012 à 14:03
Bonjour,

Je me permets de faire appel à vous parce que là je suis sans solution :
je dispose de ces trois tables pour modéliser des rencontre de tennis entre deux joueurs de même club ou de clubs difféfrents :
La table club(num_club,nom, adresse,telephone)
La table joueur(num_license,#num_club,nom,prenom,adresse,sexe,telephone)
et la table match(num_match,#num_license1,#num_license1,#num_license2,#num_club1,#num_club2,date_match)

Voici ce que je voudrais faire :
Insérer des valeurs aléatoires de joueurs et de clubs dans la table match mais que ce soit cohérent avec la table adhérent par exemple si le joueur a fait partie du club C1 alors dans match , j'aurai cet adherent avec le bon club auquel il est affilié.
Cependant comme j'insère des valeurs aléatoires pour des insertions multiples pour modéliser les matchs sur une saison , les joueurs ne sont plus dans les bons clubs.
J'ai donc décidé de faire un trigger qui corrigerait cela en updatant le num_club avec le num_club associé au joueur dans la table joueur avec une sous-requête :
CREATE OR REPLACE TRIGGER majclub
AFTER INSERT on Match for each row
begin
UPDATE temp_match set num_club1= (select num_club from adherent where num_license= :old.num_license1)
where num_match = :old.num_match;
end;
/
Mais j'ai une erreur ORA-04091: table ma_table is mutating, trigger/function may not see it
dès que je veux insérer des matchs à cause du trigger si vous avez une solution à mon problème je suis toute ouïe



1 réponse

jee pee Messages postés 40359 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 octobre 2024 9 390
22 oct. 2012 à 18:10
Salut,

L'erreur signifie que tu demandes au trigger de mettre à jour une table qui est en cours de mise à jour ou qui même a déclenché le trigger. En gros tu boucles.

C'est donc une mauvaise conception.

Tu n'as d'ailleurs pas mentionné la table temp_match ?

Plutôt d'insérer des valeurs aléatoires, tu devrais revoir ton programme pour insérer les infos du club issus de la table joueur, pas essayer de corriger après coup une valeur mise au pif.

cdlt

1
bonsoir,

j'ai oublié de modifier c'est la table match que j'update dans le trigger mais bon ca va conduire au même problème.
j'ai déjà essayé en faisant la sous requête dans le insert pour le champ num_club1 comme ci-dessous :
INSERT INTO match(num_match,num_license1,num_license2,num_club1,num_club2,date_match)
(SELECT '',dbms_random.value(1,60),dbms_random.value(1,60),select num_club from adherent where num_license=''),dbms_random.value(1,15),TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2455928,2455928+364)),'J')
FROM DUAL
CONNECT BY LEVEL <= 50);
Le problème , c'est que je sais pas quoi mettre après le num_license pour qu'il le fasse pour chaque ligne en modifiant le num_club
0
vu qu'il me faut un resultat unique à chaque fois
0
Est-ce que quelqu'un peut m'aider SVP parce que je suis sans solution
0
Et comment j'insère les données du club issus de la table match parce que j'imagine que c'est avec une sous-requête sur le champ club cependant c'est impossible parce que j'ai besoin de récupérer le num_license à chaque ligne pour intérroger la table joueur . Merci de m'aider jee pee
la sous-requête elle serait du style : select num_club from joueur where num_license=(select num_license1 from match where num_license=??? et je sais pas quoi mettre pour le faire pour chaque ligne de match ou si t'as une autre idée merci de m'aider
0