Instead of querying data dictionary. You can create function to return list of column in table/view/synonym.
create type list_varchar2 is table of varchar2(100);
/
create or replace function list_of_column(p_name in varchar2) return list_varchar2 PIPELINED
is
v_Cnt number := 0;
v_table_description dbms_sql.desc_tab;
c_curosor integer default dbms_sql.open_cursor;
begin
dbms_sql.parse( c_curosor, 'select * from '|| p_name||' where 1 = 2', dbms_sql.native );
dbms_sql.describe_columns( c => c_curosor,
col_cnt => v_Cnt,
desc_t => v_table_description );
for i in 1 .. v_Cnt
loop
pipe row ( v_table_description(i).col_name );
end loop;
dbms_sql.close_cursor(c_curosor);
exception
when others then dbms_sql.close_cursor( c_curosor );
raise;
end ;
/
select * from table(list_of_column('table_name'))
/
select * from table(list_of_column('view_name'))
/
select * from table(list_of_column('synonym'))
/