ref cursor column names

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;