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 :

Sélection du contenu des indexs d'une table


Sujet :

Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut Sélection du contenu des indexs d'une table
    Bonjour ,

    Je cherche à récupérer le contenu de tous les index d'une table sous oracle.

    Ce qui donne un peu près le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM MaTable
    WHERE COLUMN_NAME IN
           (SELECT * FROM DBA_INDEXES WHERE TABLENAME = 'MaTable')
    Sauf qu'évidemment, ça ne marche pas Pour cause : identificateur COLUMN_NAME invalide (ORA-00901)

    Quelqu'un aurait une idée de comment je pourrais faire ? Merci d'avance

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par Skualys Voir le message
    Bonjour ,

    Je cherche à récupérer le contenu de tous les index d'une table sous oracle.
    ...
    Quelqu'un aurait une idée de comment je pourrais faire ? Merci d'avance
    Je ne comprends pas ce que vous cherchez à faire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    En fait j'ai un certains nombre de colonnes indexées dans la table MaTable. Je cherche à en récupérer tous les enregistrements (uniquement ceux des colonnes indexées, donc.)

    Si vous préférez, on aurait quelque chose comme ça, qui est syntaxiquement incorrect (mais correspond peut être mieux à l'idée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT
    (SELECT COLUMN_NAME FROM ALL_IND_COLUMNS WHERE TABLENAME = "MaTable") FROM MaTable

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Hello,

    Je ne comprend pas bien la question.
    Si tu cherches à récupérer le noms des colonnes indéxées d'une table, tu peux utiliser la requête suivante (je n'ai pas d'Oracle sous la main):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select index_name, table_name, column_name, column_position
    from user_ind_columns
    where UPPER(table_name) = 'xxxxxMA_TABLExxxxx'
    order by 2;
    Ensuite, si tu veux plus de détails sur ton index, tu peux utiliser la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select  index_name, table_name, index_type, uniqueness 
     from user_indexes
     where ...
    Tu peux également faire une jointure directement sur INDEX_NAME mais si tu pouvais un peu mieux expliquer le résultat souhaité, je suis sur qu'on pourrait facilement trouver la requête adéquate,

    Bien à toi,

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Rien ne vaut un exemple : admettons que j'ai une table CLIENT avec pour colonnes indexées ID et NOM.

    J'aimerai produire quelque chose d'équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID, NOM FROM CLIENT
    , mais devoir utiliser le nom des colonnes dans la clause select. A la place, j'aimerai dynamiquement chercher tous les enregistrements des colonnes indexées, dont la liste m'est fournie par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT COLUMN_NAME FROM ALL_IND_COLUMNS WHERE TABLENAME = 'CLIENT')

  6. #6
    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
    Faut générer dynamiquement les noms de colonnes => EXECUTE IMMEDIATE

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Citation Envoyé par McM Voir le message
    Faut générer dynamiquement les noms de colonnes => EXECUTE IMMEDIATE
    Merci Pas le choix donc, utilisation de PL/SQL ?

  8. #8
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Hello Skualys,

    Malheureusement, je ne vois pas de solutions **simples** à ton problème...

    Avec un EXECUTE IMMEDIATE, tu risques d'avoir pas mal de parsing à faire en PL/SQL. Ne connaissant ni le nombre de colonnes, ni leur types à l'avance, ni la table sur laquelle la reqûete sera executée, c'est dur de prévoir quoique ce soit. Donc, personnellement, je ne vois pas comment faire sans un parsing pur et dur (ce qui est long à écrire);

    Peut-être quelqu'un d'autre aura une solution à laquelle je n'ai pas pensé / que je ne connais pas.

    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
     
    declare
     indexed_colums  VARCHAR2(4000) := '';
     inspected_table VARCHAR2(255) := 'TABLE';
     
    begin 
     
      SELECT wmsys.wm_concat(column_name)
        INTO indexed_colums
        FROM user_ind_columns
       WHERE UPPER(table_name) = inspected_table
    GROUP BY table_name;
     
    EXECUTE IMMEDIATE 'SELECT ' || indexed_colums || ' FROM ' || inspected_table ;
     
    end;
    [Edited to correctly close the code!]

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Non, le PL/SQL n'est pas impératif, mais je n'arrive pas à trouver l'intérêt de ce que vous cherchez à faire.

    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
    DEFINE TAB=TEST
     
    SET HEADING OFF PAGESIZE 1000 LINESIZE 200 ECHO OFF VERIFY OFF
     
    spool requete.sql
     
    select commande from
    (select 'select' COMMANDE, 0 RANG from dual
    union
    select decode(rownum, 1, column_name, ', ' || column_name), rownum RANG from user_ind_columns where table_name='&TAB'
    union
    select 'from &TAB;', 999999 from dual)
    order by rang;
     
    spool off
     
     
    set heading on
    @requete.sql
    Il faut mettre ça dans un script, remplacer TEST par le nom de votre table au niveau du DEFINE, et exécuter le script par @.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Merci bien

    En fait mon problème est le suivant : on souhaite purger la base d'élément trop anciens ; pour ce faire on va vérifier d'abord qu'ils ne sont pas référencés dans des documents récents.

    Le souci étant que je ne sais pas forcément dans quelles tables se trouvent quelles références (par exemple on trouve trace des clients dans les factures, les bons de réceptions, etc., mais on a pas pu m'en fournir une liste exhaustive).

    Par chance, les codes clients (et autres) ont un formatage spécifique, qui me permettrait d'en repérer la trace en parcourant toutes les colonnes indexées de toutes les tables.

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/02/2011, 18h42
  2. [WD15] Contenue des colonnes d'une table
    Par thierrybatlle dans le forum WinDev
    Réponses: 1
    Dernier message: 12/02/2010, 15h23
  3. Réponses: 1
    Dernier message: 04/05/2008, 23h26
  4. [OC]Aligner le contenu des colonnes d'une table à gauche
    Par Doctor Z dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 08/11/2007, 22h07
  5. Réponses: 14
    Dernier message: 19/10/2006, 14h23

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