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

PL/SQL Oracle Discussion :

trigger et creation des colonnes


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Points : 35
    Points
    35
    Par défaut trigger et creation des colonnes
    Bonjour,

    je suis sous oracle 9i,
    j'ai une table de parametrage qui contient:
    col_name col_type

    je veux qu'une fois une valeur a été rajoutée dans col_name, le trigger crée une colonne dans la table Table_Val, en utilisant les info col_name, col_type

    Merci

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Trigger ON_INSERT et EXECUTE IMMEDIATE pour ajouter la colonne

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    Je suis debutante, et je ne vois pas comment faire avec un Execute immediate
    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par radahm Voir le message
    Je suis débutante, et je ne vois pas comment faire avec un Execute immediate
    Merci
    Le fait d'être débutant n'empêche pas l'utilisation de google...
    http://sheikyerbouti.developpez.com/..._immediate/#L4

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    Bonjour,
    voila j'ai créé le trigger ci-dessous, mais cela ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE TRIGGER .TR_Parametres 
    after insert
    on TABLE_PARAM 
    for each row
    BEGIN
       EXECUTE IMMEDIATE 'ALTER TABLE table_val ADD('
                         || TABLE_PARAM.col_name
                         || ' '
                         || TABLE_PARAM .col_type
                         || ');';
    END;
    Mais ca ne fonctionne pas.
    Merci pr votre aide

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Mais ca ne fonctionne pas.
    Voila qui nous éclaire bien sur le problème

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Les valeurs insérées sont récupérées à l'aide de ":new".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE TRIGGER aftr_parametres
       AFTER INSERT
       ON table_param
       FOR EACH ROW
    BEGIN
       EXECUTE IMMEDIATE    'ALTER TABLE table_val ADD('
                         || :new.col_name
                         || ' '
                         || :new.col_type
                         || ')';
    END;
    NB: pas de ';' à la fin de la requête dans le EXECUTE IMMEDIATE.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Malheureusement cela ne fonctionnera pas, les triggers n'acceptant pas de commit. Or votre execute immediate lance une requete DDL, avec commit implicite donc.

    Si vous souhaitez néanmoins réaliser cela en trigger, appelez une procédure que vous créerez en transaction autonome. Bien sûr l'aspect transactionnel sera perdu puiqu'un rollback après une insertion ne fera pas le drop des colonnes ajoutées à la table "table_val".

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    Merci pr la reponse
    Mais
    en transaction autonome??

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut


    Faudrait peut-être pas trop pousser

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Ajouter l'instruction PRAGMA AUTONOMOUS_TRANSACTION.

    Ce pragma indique que la transaction se fera en dehors de la transaction principale qui l'a appelée, de manière indépendante. Ainsi commit et rollback effectués dans une transaction autonome ne concerneront pas la transaction appelante.
    C'est assez utile, entre autres, pour du monitoring de long batches.

    Vous pouvez indiquer le pragma directement dans votre trigger. Personnellement je préfère écrire les procédures autonomes à part.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE PROCEDURE proc_X 
    IS
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
       ... votre code ici
       COMMIT;
    END;

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    encore le mm erreur
    "ORA-00911: invalid character"

    Dans la procedure, avant d'executer la rq je l'affiche et en copiant ce qui a été affiché ma rq s'execute correctement.

    Merci

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    t'as un caractère qui traine quelque part... on va pas débugguer pour toi

    PS : merci d'éviter l'excès d'abréviations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Creation d'une ListView, affichage des colonnes
    Par affreuxzozo dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/03/2013, 12h55
  2. DataGridView - creation des colonnes et ligne manuellement
    Par Leelith dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/12/2008, 17h01
  3. Sommer des colonnes avec un trigger MySQL
    Par Benoit7114 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 17/01/2008, 12h08
  4. TRIGGER sur des colonnes de la table
    Par hardmehdi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2007, 16h36
  5. Liste des colonnes "updatées" dans un Trigger
    Par rapha51 dans le forum Oracle
    Réponses: 3
    Dernier message: 09/03/2007, 17h47

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