IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Déclaration dynamique de noms de colonnes


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Déclaration dynamique de noms de colonnes
    Bonjour,

    je rencontre un problème pour la création d'un trigger. Je souhaite détecter sur un UPDATE le nom du champ modifié ainsi que l'ancienne valeur et la nouvelle pour les insérés dans une table de traçage.

    Le problème est le suivant : ma table d'origine contient plus de 50 champs. Du coup, je souhaitais faire tourner une boucle parcourant la liste des champs et testant l'égalité entre ancienne et nouvelle valeur. En cas d'inégalité, on insère ces valeurs dans la table TRACE.
    Mais un point me bloc : si le PLSQL permet d'utiliser :OLD.champ et :NEW.champ, il ne permet pas d'utiliser les variables :OLD.tmp et :NEX.tmp où tmp := 'champ1'.


    Pour plus de compréhension voici le code de mon trigger :

    ----------------------------------------------------
    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
    CREATE OR REPLACE TRIGGER immo_modif
      AFTER UPDATE ON immo_pphys
      FOR  EACH ROW 
     
    DECLARE
          champ VARCHAR2(50);
          cursor lignetmp is SELECT COLUMN_NAME,DATA_TYPE  FROM user_tab_columns WHERE table_name = 'IMMO_PPHYS';
          ligne_rec lignetmp%ROWTYPE;
     
     BEGIN
     open lignetmp;
     loop
       fetch lignetmp into ligne_rec;
       exit when lignetmp%NOTFOUND;
     
      IF :OLD.ligne_rec.COLUMN_NAME <> :NEW.ligne_rec.COLUMN_NAME then 
     
              insert INTO immo_trace (champ,OLD,new) values (ligne_rec.COLUMN_NAME,':OLD.'||ligne_rec.COLUMN_NAME,':NEW.'||ligne_rec.COLUMN_NAME);
     
      END if;
     end loop;
     close lignetmp;
      END;
    ------------------------------

    Est-il possible de déclarer des variables de type 'colonne' ?
    --> actuellement mes colonnes ligne_rec.column_name sont en fait de simples varchar...

    Merci à toute personne capable de m'aiguiller vers une méthode autre qu'un IF .. ELSE IF ..ELSE IF sur chaque nom de champ.



    PS : je suis sous ORACLE 8i

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Sans passer par une procédure PL/SQL, tu peux faire un petit exécutable avec un fichier PRO*C précompilé qui scrute ta table.
    Avec un descripteur SQL (et avec une méthode dynamique 4), tu pourras détecter puis tracer les évolutions.
    Mais bon, ça n'est qu'une bidouille et pas du PL/SQL

  3. #3
    Membre habitué Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Si tu veux tester si un nom de champs a changé , il ne faut pas placer le trigger dans la table où les changements s'effectuent , mais dans une autre table du métamodél , dans ce cas le nom des colonnes sera traité comme une valeur normale.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    en fait je ne cherche pas a savoir si le nom a changé mais si la valeur a changé...

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/11/2009, 15h59
  2. Comment rendre dynamique les noms des colonnes d'une vue
    Par patic dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/02/2009, 10h41
  3. [IBATIS] nom de colonne dynamique dans le mapping
    Par jgfa9 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 02/01/2008, 14h01
  4. Création de table avec nom de colonne dynamique
    Par jibileg dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/12/2007, 22h13
  5. Réponses: 10
    Dernier message: 24/05/2007, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo