Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/08/2007, 16h18   #1
jmacrez
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 7
Points : 2
Points : 2
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.
jmacrez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 17h12   #2
7gyY9w1ZY6ySRgPeaefZ
Expert Confirmé Sénior
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 537
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 537
Points : 4 183
Points : 4 183
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/ )
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2007, 13h06   #3
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 931
Points : 4 873
Points : 4 873
une approche xml serait pour avoir la 3e colonne de la table EMP :
Code :
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 :
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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2007, 14h38   #4
7gyY9w1ZY6ySRgPeaefZ
Expert Confirmé Sénior
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 537
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 537
Points : 4 183
Points : 4 183
C'est incontestablement plus propre que ma solution !
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 08h14   #5
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
mais c'est génial même

un petit tuto sur XMLDB serait vraiment génial
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 10h01   #6
jmacrez
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 7
Points : 2
Points : 2
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 :
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.
jmacrez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 11h07   #7
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 931
Points : 4 873
Points : 4 873
peut-être avec rownum ?

Code :
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 :
1
2
3
4
 
NAME  VALUE
----- -----
ENAME ADAMS
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 12h16   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 562
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 562
Points : 4 452
Points : 4 452
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 12h29   #9
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 931
Points : 4 873
Points : 4 873
peut-être qu'il est mieux d'avoir

Code :
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"
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 14h12   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 562
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 562
Points : 4 452
Points : 4 452
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 :
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 :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 14h22   #11
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 931
Points : 4 873
Points : 4 873
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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 15h20   #12
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 931
Points : 4 873
Points : 4 873
beaucoup plus performant que mon artifice XML :

Code :
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;
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h09.


 
 
 
 
Partenaires

Hébergement Web