slt,
je cherche a déterminer le nombre de colonnes d'une table donnée !
quelle est la requéte adéquate a ma demande svp ...
merci de me répondre .
slt,
je cherche a déterminer le nombre de colonnes d'une table donnée !
quelle est la requéte adéquate a ma demande svp ...
merci de me répondre .
Nicolas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part select count(*) from user_tab_columns where table_name='YOUR_TABLE_NAME';
Salut !
Nicolas, quand j'ai lu ta réponse, j'ai été "surpris", parce que j'ai l'habitude de requêter sur USER_TAB_COLS.
Donc, je me suis demandé quelle est la différence... :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select dbms_metadata.get_ddl('VIEW', 'USER_TAB_COLUMNS', 'SYS') FROM DUALDonc au passage, j'en profite : qu'est ce qu'une HIDDEN_COLUMN ?
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 CREATE OR REPLACE FORCE VIEW "SYS"."USER_TAB_COLUMNS" ("TABLE_NAME", "COLUMN_N AME", "DATA_TYPE", "DATA_TYPE_MOD", "DATA_TYPE_OWNER", "DATA_LENGTH", "DATA_PREC ISION", "DATA_SCALE", "NULLABLE", "COLUMN_ID", "DEFAULT_LENGTH", "DATA_DEFAULT", "NUM_DISTINCT", "LOW_VALUE", "HIGH_VALUE", "DENSITY", "NUM_NULLS", "NUM_BUCKETS ", "LAST_ANALYZED", "SAMPLE_SIZE", "CHARACTER_SET_NAME", "CHAR_COL_DECL_LENGTH", "GLOBAL_STATS", "USER_STATS", "AVG_COL_LEN", "CHAR_LENGTH", "CHAR_USED", "V80_F MT_IMAGE", "DATA_UPGRADED") AS select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_TYPE_MOD, DATA_TYPE_OWNER, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID, DEFAULT_LENGTH, DATA_DEFAULT, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, LAST_ANALYZED, SAMPLE_SIZE, CHARACTER_SET_NAME, CHAR_COL_DECL_LENGTH, GLOBAL_STATS, USER_STATS, AVG_COL_LEN, CHAR_LENGTH, CHAR_USED, V80_FMT_IMAGE, DATA_UPGRADED from USER_TAB_COLS where HIDDEN_COLUMN = 'NO'
Honnetement, je ne m'etais jamais pose la question, et c'est par habitude que je travaille sur USER_TAB_COLUMNS.
Enfin, voila ce que j'ai trouve dans la docs sur les hidden columns :
"when you create a table that contains user-defined type data, the database maps columns of user-defined type to relational columns for storing the user-defined type data. This causes additional relational columns to be created. This results in "hidden" relational columns that are not visible in a DESCRIBE table statement and are not returned by a SELECT * statement. "
Nicolas.
Hmmm, zut, user_tab_columns semble donc mieux. C'est dommage, parce que c'est plus long à taper
J'ai cherché les hidden_columns sur ma base, et j'en ai retrouvées (sur un jeu de test que j'avais fait pour un autre post)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 create table testnull as select case level when 1 then null else level end as nb, 'a' as f from dual connect by level < 100; create index iitestnull on testnull(nb, 1) ; create index iitestnull2 on testnull(nb, 5) ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SQL> select table_name, column_name 2 from user_tab_cols 3 where hidden_column <> 'NO' 4 and table_name = 'TESTNULL' 5 / TESTNULL SYS_NC00003$ TESTNULL SYS_NC00004$Ce qui est amusant, c'est que si je fais juste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> select sys_nc00003$, sys_nc00004$, t.fic, t.nb 2 from testnull t 3 where rownum < 5 4 / 1 5 a 1 5 a 2 1 5 a 3 1 5 a 4
Ca ne renvoie rien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SQL> select sys_nc00003$, sys_nc00004$, t.nb 2 from testnull t 3 where rownum < 5
amusant? je n'ai pas le même résultat
Intéressant, je ne savais pas que l'on pouvait sélectionner les colonnes cachées !
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
27
28
29
30
31
32
33
34
35 SQL> drop table testnull Table dropped. SQL> CREATE TABLE testnull AS SELECT case level when 1 then NULL else level end AS nb, 'a' AS f FROM dual connect BY level < 100 Table created. SQL> CREATE INDEX iitestnull ON testnull(nb, 1) Index created. SQL> CREATE INDEX iitestnull2 ON testnull(nb, 5) Index created. SQL> select sys_nc00003$, sys_nc00004$, t.fic, t.nb from testnull t where rownum < 5 select sys_nc00003$, sys_nc00004$, t.fic, t.nb from testnull t where rownum < 5 * Error at line 1 ORA-00904: "T"."FIC": invalid identifier SQL> SELECT sys_nc00003$, sys_nc00004$, t.nb FROM testnull t WHERE rownum < 5 SYS_NC00003$ SYS_NC00004$ NB ------------ ------------ ---------- 1 5 1 5 2 1 5 3 1 5 4 4 rows selected.
Euh... je ne sais pas comment je me suis débrouillé avant, mais là ça marche à nouveau ! (je pense que j'ai du être enlevé par les extra terrestres ou un truc du genre...)
Partager