您需要决定是否使用data_length
or data_precision
基于data_type
,您可以使用 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
/
如果我将该表创建为:
create table mytablename (col1 varchar2(20), col2 number(2), col3 char(3), col4 date,
col5 timestamp(3), col6 clob, col7 number(5,2));
那么该查询会产生:
COL1,VARCHAR2,20,COL2,NUMBER,2,COL3,CHAR,3,COL4,DATE,,COL5,TIMESTAMP(3),,COL6,CLOB,,COL7,NUMBER,5.2
在这个例子中,我将一个数字表示为精确.scale,但您可能不需要担心尺度,或者可能想要以不同的方式处理它们 - 取决于结果的使用方式。我为没有大小的数据类型添加了一个空字段,例如CLOB 和日期。
另请注意,时间戳(和间隔)包括数据类型本身的精度,因此timestamp(3)
直接来自该列的data_type
。具有时区和间隔的时间戳在数据类型名称中还包含空格。
因此,这是一个起点,您可以将其扩展到需要以特定方式处理的其他数据类型,或者(例如)将时间戳精度拆分为单独的逗号分隔字段。