आपको यह तय करना होगा कि data_length
. का उपयोग करना है या नहीं या data_precision
data_type
. के आधार पर , जिसे आप केस एक्सप्रेशन के साथ कर सकते हैं:
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
इस उदाहरण में मैंने एक संख्या को परिशुद्धता . के रूप में दर्शाया है .पैमाना , लेकिन आपके पास चिंता करने के लिए तराजू नहीं हो सकते हैं, या उन्हें अलग तरह से संभालना चाह सकते हैं - यह निर्भर करता है कि परिणाम का उपयोग कैसे किया जाएगा। और मैंने बिना किसी आकार वाले डेटा प्रकारों के लिए एक खाली फ़ील्ड शामिल किया है, उदा। सीएलओबी और दिनांक।
यह भी ध्यान दें कि टाइमस्टैम्प (और अंतराल) में डेटा प्रकार में ही सटीकता शामिल होती है, इसलिए timestamp(3)
सीधे उस कॉलम के data_type
. से आ रहा है . समय क्षेत्र और अंतराल वाले टाइमस्टैम्प में डेटा प्रकार के नाम में रिक्त स्थान भी शामिल होते हैं।
तो यह एक प्रारंभिक बिंदु है, और आप इसे अन्य डेटा प्रकारों तक विस्तारित कर सकते हैं जिन्हें आपको विशिष्ट तरीकों से संभालने की आवश्यकता है, या (कहते हैं) टाइमस्टैम्प परिशुद्धता को एक अलग अल्पविराम से अलग फ़ील्ड में विभाजित करें।