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

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 9
    Points
    9
    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
    Points : 4 926
    Points
    4 926
    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 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 c'est génial même

    un petit tuto sur XMLDB serait vraiment génial

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 9
    Points
    9
    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
    Points : 4 926
    Points
    4 926
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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
    Points : 4 926
    Points
    4 926
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    non, ce n'est pas que chez toi

    ce code n'est donc pas très utilisable... il vaut peut-être mieux passer par une procédure plsql qui retourne une table de caractères

  12. #12
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    beaucoup plus performant que mon artifice XML :

    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
     
    create or replace function f(table_name varchar2, row_number number, col_number number)
    return varchar2 is
      tmp clob;
      curid NUMBER;
      desctab DBMS_SQL.DESC_TAB;
      colcnt NUMBER;
      namevar VARCHAR2(4000);
    begin
      curid := dbms_sql.open_cursor;
      dbms_sql.parse(curid, 'select * from (select t.*,rownum r from "'||table_name||'" t) where r='||row_number, dbms_sql.NATIVE);
      DBMS_SQL.DESCRIBE_COLUMNS(curid, colcnt, desctab);
      FOR i IN 1 .. colcnt LOOP
        DBMS_SQL.DEFINE_COLUMN(curid, i, namevar,4000);
      END LOOP;
      if DBMS_SQL.execute(curid) = 0 THEN
        if DBMS_SQL.FETCH_ROWS(curid) > 0 then
          DBMS_SQL.COLUMN_VALUE(curid, col_number, namevar);
        end if;
      end if;
      DBMS_SQL.CLOSE_CURSOR(curid);
      return namevar;
    end;
    /
     
    select f('EMPLOYEE',18000,3) from dual;

+ 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