declare
l_ref sys_refcursor;
l_cur integer;
l_exe integer;
l_sql varchar2(100) := 'select * from <>';
l_tab dbms_sql.desc_tab;
l_cnt integer;
l_val varchar2(4000);
l_num number;
l_dat date;
begin
l_cur := dbms_sql.open_cursor;
open l_ref for l_sql;
dbms_sql.parse(l_cur, l_sql, dbms_sql.native);
dbms_sql.describe_columns(l_cur,l_cnt,l_tab);
for i in 1..l_cnt
loop
dbms_output.put_line(i||' '||l_tab(i).col_name||' '||l_val);
-- dbms_output.put_line('|- type : '||l_tab(i).col_type);
-- dbms_output.put_line('|- max_len : '||l_tab(i).col_max_len);
-- dbms_output.put_line('|- precision : '||l_tab(i).col_precision);
-- dbms_output.put_line('|- scale : '||l_tab(i).col_scale);
-- dbms_output.put_line('|- > : '||'['|| case l_tab(i).col_type when 1 then 'varchar2('||l_tab(i).col_max_len||')' when 2 then 'number('||l_tab(i).col_precision||','||l_tab(i).col_scale||')' when 12 then 'date' end ||']');
case l_tab(i).col_type
when 2 then dbms_sql.define_column(l_cur, i, l_num);
when 12 then dbms_sql.define_column(l_cur, i, l_dat);
else dbms_sql.define_column(l_cur, i, l_tab(i).col_name,l_tab(i).col_max_len);
end case;
end loop;
l_exe := dbms_sql.execute(l_cur);
loop
if dbms_sql.fetch_rows(l_cur) = 0 then
exit;
end if;
for j in 1..l_cnt loop
case l_tab(j).col_type
when 2 then
dbms_sql.column_value(l_cur, j, l_num);
l_val := l_num;
when 12 then
dbms_sql.column_value(l_cur, j, l_dat);
l_val := to_char(l_dat,'dd-mm-yyyy hh24:mi:ss');
else
dbms_sql.column_value(l_cur, j, l_val);
end case;
dbms_output.put_line(rpad(l_tab(j).col_name,32)||l_val);
end loop;
end loop;
end;