Трябва да решите дали да използвате data_length
или 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
В този пример съм представил число като прецизност .мащаб , но може да нямате везни, за които да се притеснявате, или може да искате да се справите с тях по различен начин - зависи как ще се използва резултатът. И включих празно поле за типовете данни без размер, напр. CLOB и ДАТА.
Също така имайте предвид, че клеймата за време (и интервали) включват точността в самия тип данни, така че timestamp(3)
идва директно от data_type
на тази колона . Времевите клейма с часови зони и интервали също включват интервали в името на типа данни.
Така че това е отправна точка и можете да я разширите до други типове данни, които трябва да обработвате по специфични начини, или (да речем) да разделите точността на клеймото за време в отделно поле, разделено със запетая.