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 :

SQL dans table de structure inconnu [Fait]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Par défaut SQL dans table de structure inconnu
    Bonjour,

    est-il possible d'effectuer un select dans une table dont la structure m'est inconnue ??

    Exemple : select col(5) from ma_table
    --> cela me renverait le contenu de la colonne 5 de ma_table.

    Merci par avance de vos réponses,

    Jérôme.

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'utiliserais la table système user_tab_cols pour récupérer le nom de la colonne, je construis ma requête dynamiquement et je lance avec un execute immediate ( http://sheikyerbouti.developpez.com/execute_immediate/ )

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    une approche xml serait pour avoir la 3e colonne de la table EMP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select 
    column_name,
    extractvalue(column_value,'/ROW/'||column_name) 
    from table(xmlsequence(cursor(select * from emp))),
    user_tab_columns
    where COLUMN_ID=3 and table_name='EMP'
    ;
    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
     
    NAME VALUE     
    ---- ----------
    JOB  CLERK     
    JOB  SALESMAN  
    JOB  SALESMAN  
    JOB  MANAGER   
    JOB  SALESMAN  
    JOB  MANAGER   
    JOB  MANAGER   
    JOB  ANALYST   
    JOB  PRESIDENT 
    JOB  SALESMAN  
    JOB  CLERK     
    JOB  CLERK     
    JOB  ANALYST   
    JOB  CLERK

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est incontestablement plus propre que ma solution !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    mais c'est génial même

    un petit tuto sur XMLDB serait vraiment génial

  6. #6
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Par défaut Select nième ligne de la nième colonne
    Bonjour,

    Merci beaucoup pour la réponse.
    Je voudrais corser un peu l'ordre SQL que tu as poster sur le forum.

    Est-il possible d'effectuer un ordre SQL comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
    column_name,
    extractvalue(column_value,'/ROW/'||column_name) 
    from table(xmlsequence(cursor(select * from emp))),
    user_tab_columns
    where COLUMN_ID=3 and table_name='emp';
    mais ne récupérer que la valeur de la nième ligne de la 3ème colonne par exemple.

    Merci par avance,

    Jérôme MACREZ.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    peut-être avec rownum ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select 
    column_name,
    extractvalue(column_value,'/ROW/'||column_name)
    from table(xmlsequence(cursor(select emp.*, rownum from emp))),
    user_tab_columns
    where COLUMN_ID=2 and table_name='EMP'
    and extractvalue(column_value,'/ROW/ROWNUM')=11;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NAME  VALUE
    ----- -----
    ENAME ADAMS

  8. #8
    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
    Ca a l'air propre, mais niveau perf, je sais pas.
    En 9i : Sous toad, avec une table de 1500 lignes, au bout de 1 minute, j'arrête le Sql (par le bouton CANCEL) et là je suis déconnecté de la base.
    ORA-03113 :End-of-File on communication channel.

    Visiblement la jointure pour le extract lui bouffe pas mal de ressources.

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    peut-être qu'il est mieux d'avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select 
    column_name,
    extractvalue(column_value,'/ROW/'||column_name)
    from table(xmlsequence(cursor(select * from (select emp.*,rownum r from emp)  where r=3))),
    user_tab_columns
    where COLUMN_ID=2 and table_name='EMP';

    bon, de tout façon je trouve ça folklorique, il serait tellement plus simple de savoir quelle colonne on veut...

    s'il s'agit d'une table avec des colonnes du style X1,X2,X3, on peut aussi faire decode(:n,1,col1,2,col2,3,col3)

    et la 3e ligne d'une table, ça ne veut rien dire, car les lignes ne sont pas ordonnées (à moins qu'on employe order by)...

    c'est assez bizarre de vouloir "la 3e colonne" plutôt que de vouloir "le job" ou "la date"

  10. #10
    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
    Désolé, j'ai pas donné le code :
    C'est pas le rownum qui bloque, c'est ton premier code:
    Il n'y a que chez moi que ça foire sur une table de 1500 lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
    column_name,
    extractvalue(column_value,'/ROW/'||column_name) 
    from table(xmlsequence(cursor(select * from emp))),
    user_tab_columns
    where COLUMN_ID=3 and table_name='EMP';
    PS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select 
    extractvalue(column_value,'/ROW/NAME') 
    from table(xmlsequence(cursor(select * from emp)))
    marche impec.

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

Discussions similaires

  1. [SQL] #1109 - Table inconnue 'ville_latlong' dans where clause
    Par ffoxenn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/01/2008, 17h06
  2. Pb d'écriture intempestive dans table avec SQL insert into
    Par pete_shifter dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/11/2005, 11h51
  3. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55
  4. [PL/SQL] Utilisation table PL/SQL dans clause IN
    Par Yorglaa dans le forum PL/SQL
    Réponses: 13
    Dernier message: 05/10/2004, 10h36
  5. [SQL Access] Modifier la structure d'une table
    Par Le Lézard dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/06/2004, 14h03

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