|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Bonjour à tous,
désolé pour le titre mais je n'ai jamais été très fort dans ce domaine. Voivi tout d'abord les DDL de mes tables Code :
Je suis certain que c'est une bêtise mais je ne trouve pas le problème. Si vous avez une solution je suis preneur. D'avance merci pour vos réponses.
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
évidemment, tu ne mets pas à jour une colonne mais tu affectes la valeur insérée dans personnes_cotisations_id à la variable CREATE_PERSONNES_COTISATIONS.personnes_cotisations_id, variable qu'apparemment tu n'utilises nul par dans ta session
|
|
|
00
|
|
|
#3 | |||||||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
Un trigger 'FIRST_TRIGGER_PERS_COT' qui attribue le :new.ma_colonne à une variable globale dans le package Et un trigger 'TRIGGER_INSERT_ON_COTISATIONS' qui utilise la variable globale pour updater une colonne dans une autre table. Donc j'utilise bien la variable CREATE_PERSONNES_COTISATIONS.personnes_cotisations_id dans le deuxième trigger. package Code :
Code :
Code :
Merci beaucoup pour ton intervention.
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|||||||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
![]() Ce serait plus simple de nous expliquer ce que tout cela est sensé faire |
|
|
00
|
|
|
#5 | |
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
Donc j'utilise in 'after insert of each row' pour avoir la valeur de :new.ma_colonne dans la variable globale du package Et ensuite 'after insert' pour attribuer la nouvelle valeur dans la colonne de l'autre table. D'un autre coté je viens de mettre le premier trigger 'after insert of each row' sur disabled car j'avais déjà un trigger 'before insert' qui attribuait déjà un nouvel ID à partir d'une séquence mais le problème reste le même. Voilà en gros ce que je veux faire: 2 tables personnes personnes_cotisations j'ajoute une nouvelle personne dans la table personnes par défaut la colonne numero_membre a une valeur -1 car cette personne n'est pas encore un membre Ensuite j'ajoute une nouvelle cotisation dans la table personnes_cotisations basée sur la nouvelle personne ajoutée Une fois que cette cotisation est ajoutée, la personne devient un membre, donc le numero_membre doit avoir la valeur Code :
SELECT max(numero_membre) + 1 FROM personnes La valeur n'est pas modifiée alors que le trigger ne me retourne aucune erreur. Voilà Merci beaucoup
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|
|
|
00
|
|
|
#6 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Pourquoi pas simplement quelque chose de ce style :
Code :
|
||
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Désolé pour la suite mais c'est tellement mauvais.
Je ne sais pas si c'est pour une application réelle ou simplement pour apprendre aux étudiants le méandre et pièges des triggers (personnellement j'utilise très rarement les triggers) mais j'ai l'impression qu'il y a beaucoup de confusion dans l'ensemble du code et non pas une simple bêtise.
Je pense que tu devrait faire d'abord le ménage dans le code avant d'avancer. Pour l'instant je n'ai pas le temps de diagnostiquer le problème mais si le constat est que la mise à jour ne se fait pas et qu'il n'y a pas de message d'erreur alors le Test IF v_numero_membre_actual = -1 then devrait retourner faux. Mais pourquoi ça reste à analyser. Un bon exemple de contournement du problème de la table mutante se trouve ici (malheureusement comme je le déjà signalé les exemples de ce site sur ce problème ne se sent pas très bien non plus, pour dire ainsi). |
|
|
00
|
|
|
#8 | |
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
Et je peux prouver que j'ai un problème de table mutante si j'execute un trigger simplement sur un after insert. Maintenant je ne sais pas comment travaille APEX derrière pour insérer de nouvelles données. Je viens à l'instant de faire un test en utilisant uniquement un seul trigger 'after insert of each row' et j'ai un problème de table mutante. Maintenant si tu dis que tous les documents sur les problèmes de table mutante sont mauvais, ce serait bien que tu argumentes et montres un exemple de best practices pour résoudre le problème. Voilà Merci
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|
|
|
00
|
|
|
#9 | |||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
je suis obligé de d'utiliser le max + 1 car les numéros doivent doivent se suivre, donc pas de séquence. je viens de faire le test avec ton trigger et comme prévu j'ai un problème de table mutante. Voilà Merci
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|||
|
|
00
|
|
|
#10 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
tu peux envoyer quelques INSERT pour alimenter les 2 tables et les tests que tu as réalisé STP ? |
|
|
|
00
|
|
|
#11 | |||||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
Code :
Code :
Code :
INSERT INTO personnes (PERSONNE_ID, NOM, PRENOM, NUMERO_MEMBRE) VALUES (300,'TEST','TEST',-1); et une ligne pour insérer une cotisation Code :
INSERT INTO personnes_cotisations (PERSONNE_ID, PAYE, ANNEE_COTISATION,DATE_PAIEMENT) VALUES (300,1,2007,sysdate); Merci beaucoup pour ton aide
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|||||
|
|
00
|
|
|
#12 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
le mutating table vient de :
Code :
SELECT personne_id INTO v_personne_id FROM personnes_cotisations WHERE personnes_cotisations_id = :new.personnes_cotisations_id; cette ligne est inutile puisque tu utilises :new.personne_id plutôt que faire un SELECT Par contre tu as un no_data_found parce que tu utilises personne_id = :new.personnes_cotisations_id; alors que personnes_cotisations_id n'est pas renseignée dans l'insert... ce serait pas :new.personne_id plutôt ? ![]() essaye : Code :
|
||
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Expert Datawarehouses + BO (sur BDD Oracle et SQL Server) Inscription : mars 2003 Messages : 645 ![]() |
et as tu essayé, pour tester, de faire ton trigger sans le max mais avec constante élévée bidon pour voir si ça vient du max le souci ?
sinon je pensais à truc du style ci-dessous mais c'est un peu tiré par les cheveux et je ne sais pas si les DDL sont acceptés dans les triggers, bien que je fais de l'oracle depuis un moment. Code :
|
||
|
|
00
|
|
|
#14 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Et au lieu du MAX :
Code :
|
||
|
|
00
|
|
|
#15 | |||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
Citation:
Je crois qu'il y a une petite confusion. Si tu insères deux personnes. la première aura le personne_id = 1000 et numero_membre = -1 la deuxième aura le personne_id = 1001 et numero_membre = -1 si après, tu souhaites ajouter une cotisation à personne_id = 1000 après avoir ajouté les deux personnes, si je lis bien ton trigger c'est personne_id = 1001 qui aura le nouveau numéro_membre et non le personne_id=1000 alors que c'est à lui que je souhaite attribuer le nouveau numéro. J'espère que tu me suis bien là Donc c'est pour ça que je dois récupérer le personne_id dans la table personnes_cotisations avant de pouvoir attribuer le nouveau numéro_membre à personne_id = 1000 J'espère que c'est clair ce que dis voilà merci beaucoup
__________________
Langages : Java, SQL Outils : Eclipse, Intellij SGBD : Oracle, PostgreSQL Mes Articles |
|||
|
|
00
|
|
|
#16 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
ha oui, j'avais pas vu... bah il faut adapter mais ça doit pas être loin du compte
![]() faudrait que tu donnes les résultats attendus à la fin des inserts en faisant un SELECT des colonnes pertinentes de toutes les tables. |
|
|
00
|
|
|
#17 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
de toute façon ça :
Code :
SELECT numero_membre INTO v_numero_membre_actual FROM personnes WHERE personne_id = :new.personnes_cotisations_id; Faut débugger mais là c'est plus notre boulot |
|
|
00
|
|
|
#18 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
Concernant la critique des exemples je l'ai déjà fait sur ce forum il va falloir rechercher. Le lien qui montre les bons exemples je l’ai fourni il suffit de cliquer. J’ai oublié à signaler que le trigger qui utilise le Select Max … est conçu pour une application mono - utilisateur parce que comme il manque le verrouillage de la table sur laquelle se calcule le Max rien ne pouvait empêcher que deux utilisateurs différentes obtiens la même valeur. Ce seulement une question de type "à quel moment cela va arriver". Si ma remarque concernant l’utilisation du Nvl n’a pas été très claire alors il faut savoir que Select Max … from Table Into Variable Where False renvoie NULL et que NULL + 1 = NULL. Bon courage et si j'arrive à me trouver le temps ce WE je vais debuger le code. |
|
|
|
00
|
|
|
#19 | |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Citation:
-- Edition Désolé, j'ai réagi avant de regarder jusqu'au bout et j'ai donc formulé la même remarque que mnitu
__________________
Consultant et formateur Oracle |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com