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 :

Requête qui retourne le(s) nom(s) de colonne plutôt que le contenu de la colonne


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 13
    Par défaut Requête qui retourne le(s) nom(s) de colonne plutôt que le contenu de la colonne
    Bonjour à tous,
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select (SELECT listagg(src.column_name,',') within group (order by src.index_name)
    from(
    select ind.index_name, ind.table_name, col.column_name 
    from all_indexes ind
    inner join all_ind_columns col on ind.index_name = col.index_name
    where ind.table_name = 'NomTable' 
        and ind.uniqueness = 'UNIQUE'
    ) src    
    ) from NomTable
    ;
    Comme le dit si bien le titre, je récupère X fois le nom des colonnes composant l'index unique.
    Comment faire pour avoir le contenu de la table ?

    Merci à vous.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Tu ne peux pas passer en SQL d'une chaine de caractère à un objet SQL (colonne, table)
    Soit tu passes par EXECUTE_IMMEDIATE
    Soit tu passes par du spool

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Il faut construire la requête et l'exécuter de manière dynamique :
    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
    EXECUTE IMMEDIATE
        'SELECT '
            ||  SELECT  LISTAGG(src.column_name, ',') WITHIN GROUP (ORDER BY src.index_name)
                FROM    (   SELECT  ind.index_name
                                ,   ind.table_name
                                ,   col.column_name 
                            FROM    all_indexes ind
                                INNER JOIN 
                                    all_ind_columns col 
                                    ON  ind.index_name = col.index_name
                            WHERE   ind.table_name = 'NomTable' 
                                AND ind.uniqueness = 'UNIQUE'
                        )   src    
            ||  ' FROM  NomTable'
    ;
    La requête peut certainement être optimisée...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 13
    Par défaut
    Merci McM et Alain,

    J'ai une p'tite erreur lorsque j'écris ce code:

    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
    req1:=
        'SELECT '
            || '( SELECT  LISTAGG(src.column_name, '','') WITHIN GROUP (ORDER BY src.index_name)
                FROM    (   SELECT  ind.index_name
                                ,   ind.table_name
                                ,   col.column_name 
                            FROM    all_indexes ind
                                INNER JOIN 
                                    all_ind_columns col 
                                    ON  ind.index_name = col.index_name
                            WHERE   ind.table_name = ''TDD_COD_CNL'' 
                                AND ind.uniqueness = ''UNIQUE''
                        )   )  
            ' ||  ' FROM  TDD_COD_CNL'
    ;
    Execute immediate req1  ;
    En effet j'ai le message d'erreur: "PL/SQL: ORA-03001: unimplemented feature"

    Aurais-je dû laisser le code d'Alain comme tel ?

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bein oui
    Par contre, un execute immediate qui renvoie des valeurs doit avoir une clause INTO
    Regarde dans les tutos la partie Collections.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Vous pouvez ouvrir un curseur construit dynamiquement pour afficher le contenu de la table.

    Exemple depuis sqlplus ou sqldeveloper :
    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
    24
    25
    26
    27
    28
    29
    30
    SQL> var rc refcursor
    SQL> declare
      l_list_col varchar2(500);
      l_table_name varchar2(30) := 'T';
    begin
      select ind.table_name, listagg(col.column_name,',') within group (order by ind.index_name, col.column_position) as list_col
        into l_table_name, l_list_col
        from all_indexes ind
        join all_ind_columns col
          on ind.index_name = col.index_name
       where ind.table_name = l_table_name
         and ind.uniqueness = 'UNIQUE'
       group by ind.table_name;
     
      open :rc for
      'select '||l_list_col||' from '||l_table_name;
    end;
    /
     
    Procedure PL/SQL terminee avec succes.
     
    SQL> print :rc;
     
            C1         C2
    ---------- ----------
             1          2
             3          2
             2          3
     
    SQL>
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    drop table t;
    create table t (c1 number(10), c2 number(10));
    create unique index uk_t on t(c1,c2);
     
    insert into t values (1,2);
    insert into t values (3,2);
    insert into t values (2,3);
     
    commit;

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 13
    Par défaut
    Merci Skuatamad et les autres pour vos réponses !

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

Discussions similaires

  1. [MySQL] Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 17/06/2011, 18h37
  2. Réponses: 1
    Dernier message: 03/02/2009, 15h44
  3. requète qui retourne la derniere ligne d'un ensemble de tuple
    Par Stouille33 dans le forum Développement
    Réponses: 4
    Dernier message: 14/11/2008, 09h15
  4. Requête qui retourne la somme totale de durées
    Par fayred dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/01/2008, 16h21
  5. [MySQL] Ma requête ne retourne qu'un nom si leur valeur sont egal => je veux avoir les 2 noms
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 15h28

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