select
case when r = 1 then (select s.COMMENTS from user_tab_comments s where Table_Name= aa.table_name) else '' end as table_comments,
case when r = 1 then aa.table_name else '' end as table_name,
aa.r as column_sequence,
aa.COLUMN_NAME,
aa.DATA_TYPE,
aa.data_length,
(select 'Y'
from user_cons_columns cu, user_constraints au
where cu.constraint_name = au.constraint_name and au.constraint_type = 'P'
and au.table_name = aa.table_name
and cu.COLUMN_NAME = aa.COLUMN_NAME) as IS_PK,
aa.NULLABLE,
aa.DATA_DEFAULT,
aa.column_comments
from
(
select row_number() over(partition by t.OBJECT_NAME order by t.OBJECT_NAME) r,
t.OBJECT_NAME as table_name,
c.COLUMN_NAME,
c.DATA_TYPE,
case when c.NULLABLE = 'N' then 'NOT NULL' else '' end as NULLABLE,
case when c.DATA_TYPE in ('NVARCHAR2','CHAR','VARCHAR2') then to_char(c.CHAR_LENGTH)
when c.DATA_TYPE in ('LONG','FLOAT','CLOB','BLOB','DATE')then ' '
when c.DATA_TYPE = 'NUMBER' then
case when c.DATA_PRECISION is null and c.DATA_SCALE = 0 then
'INTEGER'
else
rtrim(c.DATA_PRECISION ||','|| c.DATA_SCALE,',')
end
else ' ' end as data_length,
cc.COMMENTS as column_comments,
c.DATA_DEFAULT
from user_objects t,
user_tab_columns c,
user_col_comments cc
where t.OBJECT_TYPE = 'TABLE'
and c.TABLE_NAME = t.OBJECT_NAME
and cc.TABLE_NAME = c.TABLE_NAME
and cc.COLUMN_NAME = c.COLUMN_NAME
) aa;