Bạn cần quyết định có sử dụng data_length
hay không hoặc data_precision
dựa trên data_type
, bạn có thể thực hiện với biểu thức chữ hoa chữ thường:
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
/
Nếu tôi tạo bảng đó dưới dạng:
create table mytablename (col1 varchar2(20), col2 number(2), col3 char(3), col4 date,
col5 timestamp(3), col6 clob, col7 number(5,2));
thì truy vấn đó tạo ra:
COL1,VARCHAR2,20,COL2,NUMBER,2,COL3,CHAR,3,COL4,DATE,,COL5,TIMESTAMP(3),,COL6,CLOB,,COL7,NUMBER,5.2
Trong ví dụ này, tôi đã biểu thị một số là độ chính xác . quy mô , nhưng bạn có thể không phải lo lắng về cân hoặc có thể muốn xử lý chúng theo cách khác - tùy thuộc vào kết quả sẽ được sử dụng như thế nào. Và tôi đã bao gồm một trường trống cho các loại dữ liệu không có kích thước, ví dụ:CLOB và DATE.
Cũng lưu ý rằng dấu thời gian (và khoảng thời gian) bao gồm độ chính xác trong chính loại dữ liệu, vì vậy timestamp(3)
đến trực tiếp từ data_type
của cột đó . Dấu thời gian với múi giờ và khoảng thời gian cũng bao gồm dấu cách trong tên loại dữ liệu.
Vì vậy, đây là điểm bắt đầu và bạn có thể mở rộng nó sang các loại dữ liệu khác mà bạn cần xử lý theo những cách cụ thể hoặc (giả sử) chia độ chính xác của dấu thời gian thành một trường được phân tách bằng dấu phẩy riêng biệt.