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

SQL Oracle Discussion :

nom de colonne dans une variable


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 37
    Points
    37
    Par défaut nom de colonne dans une variable
    Bonjour,
    Comment pourrai je faire un select sur une colonne dans une table
    sachant que le nom de la colonne en question est stocké dans une variable ??

    colname varchar2(10);
    colname := 'colonne1';

    select (colname) from tab1
    where ....

    merci d'avance

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    du SQL dynamique mais ça dépend ce que tu veux faire exactement (application, requête simple, etc.)
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par nuke_y
    du SQL dynamique mais ça dépend ce que tu veux faire exactement (application, requête simple, etc.)
    C'est à dire aller voir du coté de "EXECUTE IMMEDIATE" dans la doc PL/SQL ou bien jouer avec les spool s'ils s'agit de traitement simple par sqlplus...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 37
    Points
    37
    Par défaut
    J'aimerai tester dans un "trigger sur update" si certaines colonnes ont changés de valeur
    les colonnes en question sont dans une table de parametrage.

    j'ai vu le sql dynamique ...
    quand je construit ma requete dynamiquement et j'essaye de l'executer via EXECUTE IMMEDIATE il gueule,
    c'est normal les rowtype new et old ont une portée (trigger)

    si vous avez une idée ou un bout de code je suis preneur
    merci encore

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par cyclone_yas
    quand je construit ma requete dynamiquement et j'essaye de l'executer via EXECUTE IMMEDIATE il gueule,
    C'est un peu léger comme indice, je suppose qu'il se contente pas de faire "AAAAAAAHHHHHH!!" il doit bien te donner un message quand meme ?

    Sinon si c'est comparer des ancienne et nouvelles valeurs, il tu peux utlisiser :OLD et :NEW ... mais le problème c'est que ça se fait pas en dynamique c'est vrai.... donc tu pourra pas faire une fonction générique qui marchera pour toutes les tables...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 37
    Points
    37
    Par défaut
    voila le message d'erreur :
    ORA-04092 : Pas de libelle dans TMESPEC

    voila ce que je pense :
    Quand je construit dynamiquement des requettes les objects utilisés sont dans la base tables, vues ... (portée globale)
    là le problème, c'est que l'info est stoquée dans un rowtype (old et new) en memoire inaccessible depuis l'EXECUTE IMMEDIATE

    je construit une requette semblable à :

    requete := 'select 1 from dual where p_old.CAPINT != p_new.CAPINT OR p_old.CATSSJT != p_new.CATSSJT OR p_old.CATVAR1 != p_new.CATVAR1'

    que j'execute :
    EXECUTE IMMEDIATE requete into changed;

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Oui tu ne pourras pas mettre de :new et :old dans une requête dynamique, il faut que tu soit exaustif sur tes noms de colonnes en dur dans le trigger... à la limite tu peux automatiser la création de ton trigger au moment ou tu crée la table...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 37
    Points
    37
    Par défaut
    je vais exposer autrement mon problème:
    je dispose d'une table Tab(col1, col2, col3 .... coln)

    L'idée est de lancer un traitement à chaque fois que l'une des colonne "coli" ou "colj" est mise à jour. les noms des colonnes "coli" et "colj" sont dans une table de paramètrage.

    j'aimerai intervenir au niveau du trigger sur update de la table "Tab" ou je dispose des rowtypes "new" et "old".
    ma question est comment ecrire cette requete :

    IF new.coli != old.colj OR
    new.coli != old.colj
    THEN
    (traitement);
    END IF;


    sans mettre explicitement les noms des colonnes "coli" et "colj" dans la requete ??


    si je dispose de veux variables qui contiennent les noms de ces colonnes :
    var1 :="coli";
    var2 :="colj";

    comment pourrai je réecrire la même requete en utilisant var1 et var2 ??

    Merci beaucoup pour le temps que vous consacrez à lire et à répondre.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    oui j'avais bien compris mais malheureusement, c'est pas possible (en tout cas je ne vois pas comment faire de manière simple...) tu vas devoir faire en dur ton test pour toute tes colonnes...

  10. #10
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Tu ne peux pas mettre :old et :new dans un objet générique qui contient des tuples et boucler sur les n colonnes de cet objet ? Genre un tableau quoi.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 67
    Points : 37
    Points
    37
    Par défaut
    Merci

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par nuke_y
    Tu ne peux pas mettre :old et :new dans un objet générique qui contient des tuples et boucler sur les n colonnes de cet objet ? Genre un tableau quoi.
    On peut toujours optimiser le code au maximum en limitant à la portion congrue la partie spécifique à chaque table, mais meme là, dans la boucle il va bien faloir mettre :new.NOM_DE_COLONNE en dur car ça ne passera pas le execute immediate. Mais se posera à ce moment là le problème du typage de ce tableau générique.

  13. #13
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Sauf s'il est possible de dire tableau = :old%ROWTYPE (syntaxe conceptuelle hein ? ), mais est-ce possible ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Discussions similaires

  1. Nom de colonne dans une @variable
    Par Devilstuff dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/09/2012, 08h46
  2. [XSLT] Attribut dont le nom est stocké dans une variable ?
    Par Xfennec dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/03/2006, 11h20
  3. Shell: récupérer le bon nom de fichier dans une variable
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 11h45
  4. Réponses: 7
    Dernier message: 25/10/2005, 15h19
  5. Noms de colonne dans une colonne
    Par Digirom dans le forum Langage SQL
    Réponses: 14
    Dernier message: 23/04/2004, 11h51

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