Vous devez décider si vous souhaitez utiliser data_length
ou data_precision
basé sur le data_type
, ce que vous pouvez faire avec une expression case :
select listagg(column_name ||','|| data_type ||','||
case
when data_type in ('VARCHAR2', 'NVARCHAR2', 'CHAR', 'RAW')
then to_char(data_length)
when data_type = 'NUMBER'
and (data_precision is not null or data_scale is not null)
then data_precision || case
when data_scale > 0 then '.' || data_scale
end
end, ',') within group (order by column_id)
from all_tab_columns
where table_name = 'MYTABLENAME'
and owner = user -- if it is always current user, use user_tab_columns instead
/
Si je crée cette table en tant que :
create table mytablename (col1 varchar2(20), col2 number(2), col3 char(3), col4 date,
col5 timestamp(3), col6 clob, col7 number(5,2));
alors cette requête produit :
COL1,VARCHAR2,20,COL2,NUMBER,2,COL3,CHAR,3,COL4,DATE,,COL5,TIMESTAMP(3),,COL6,CLOB,,COL7,NUMBER,5.2
Dans cet exemple, j'ai représenté un nombre comme précision .échelle , mais vous n'aurez peut-être pas à vous soucier des échelles, ou vous voudrez peut-être les gérer différemment - cela dépend de la façon dont le résultat sera utilisé. Et j'ai inclus un champ vide pour les types de données sans taille, par ex. CLOB et DATE.
Notez également que les horodatages (et les intervalles) incluent la précision dans le type de données lui-même, donc le timestamp(3)
vient directement du data_type
de cette colonne . Les horodatages avec fuseaux horaires et intervalles incluent également des espaces dans le nom du type de données.
Il s'agit donc d'un point de départ, et vous pouvez l'étendre à d'autres types de données que vous devez gérer de manière spécifique, ou (par exemple) diviser la précision de l'horodatage dans un champ séparé séparé par des virgules.