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.
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.
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/ )
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
17NAME 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
C'est incontestablement plus propre que ma solution !
mais c'est génial même
un petit tuto sur XMLDB serait vraiment génial
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 :
mais ne récupérer que la valeur de la nième ligne de la 3ème colonne par exemple.
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';
Merci par avance,
Jérôme MACREZ.
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
4NAME VALUE ----- ----- ENAME ADAMS
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
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"
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 ?
PS :
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';
marche impec.
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)))
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
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
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager