Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 04/01/2008, 15h53   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 0
Points : 0
Par défaut new et old dans trigger

Bonjour,


Je suis débutant en PL/SQL et j'ai absolument besoin de faire un trigger
dans lequel je selectionne le noms des champs de ma table (noms que je ne connais pas) que je stocke dans un tableau...

le problème consiste à comparer les anciennes et nouvelles valeurs de chaque
champs lors d'un update sur cette table

genre : IF OLD.Tableau(i)<>NEW.Tableau(i) THEN...

le probleme est qu'ORACLE ne possède pas de variable dynamique et que
je suis obligé de taper les noms en dur. Ce que je ne veux (et peux) pas faire

en vous remerciant par avance de votre réponse

Frank
frank71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 16h40   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
il y a peut-être une autre méthode que ce genre de trigger. Que veut tu vérifier exactement ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 17h02   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 0
Points : 0
Par défaut ce que je veux faire

En fait, je veux comparer l'ancien enregistrement et le nouvel enregistrement
d'une table (suite à un update) et déclencher via un trigger sur la table, une historisation de ces changements dans une table historique.

La table a modifier contient beaucoup de champs (une centaine), je ne veux pas les écrire en dur dans mon trigger : OLD.nomChamps1<>NEW.nomChamp1.

je veux utiliser un tableau qui contient le nom des champs de la table
et acceder à ces champs de manière dynamique...

OLD.tableau(i)

Est ce possible ?
frank71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 17h08   #4
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 0
Points : 0
Par défaut suite

j'ai bien essayé de contourner le problème en essayant de "chopper"
la valeur du old et du new dans une requête.

Requete:='SELECT :OLD.' || tableau(i) || ' into :var FROM DUAL';
EXECUTE IMMEDIATE Requete ;

Tableau(i) contenant le nom de la colonne

mais celà ne marche pas.
frank71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 17h12   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
tu peux éventuellement te servir de execute immediate pour récupérer le nom des colonnes mais ça me parait très compliqué... ce serait nettement plus simple de mettre les noms en dur et probablement plus performant

je crains que ce ne soit pas faisable de développer un trigger générique
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 17h26   #6
Invité de passage
 
Inscription : janvier 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 4
Points : 0
Points : 0
Merci beaucoup

je vais essayer une autre méthode que ce trigger générique qui devait s'adapter à plusieurs table...

frank71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web