Search notes:

Oracle: DBMS_SQL.DESCRIBE_COLUMNS

set serveroutput on
declare

   sql_stmt   varchar2(32000) := 'select ''Hello world'' "A text", 42 a_number, dummy from dual';
   c          number;
   cntCols    number;
   cols       dbms_sql.desc_tab2;

   datatype varchar2(8);
begin
   dbms_output.new_line;

   c := dbms_sql.open_cursor;

   dbms_sql.parse(c, sql_stmt, dbms_sql.native);
   dbms_sql.describe_columns2(c, cntCols, cols);

   for i in 1 .. cntCols loop
    
      datatype := case cols(i).col_type
         when dbms_sql.varchar2_type then 'varchar2'
         when dbms_sql.char_type     then 'char'
         when dbms_sql.number_type   then 'number'
         else to_char(cols(i).col_type)
      end;

      dbms_output.put_line('  ' || rpad(cols(i).col_name, 10) || datatype);
      
   end loop;

   dbms_sql.close_cursor(c);

end;
/

Four versions of desc_rec

There are four versions of the describe_columns procedure: describe_columns, describe_columns2, describe_columns3 and describe_columns4. Each of these returns a corresponding desc_tab … desc_tab4 which in turn is a table of a desc_rec … desc_rec4 structure.

Differences of the desc_rec structures

The fields of the desc_rec structures are
Field name Differences
col_type
col_max_len
col_name Differs in length (desc_rec: varchar2(32), other three varchar2(32767))
col_name_len desc_rec … desc_rec3: varchar2(32), desc_rec4: dbms_id
col_schema_name
col_schema_name_len
col_precision
col_scale
col_charsetid
col_charsetform
col_null_ok
col_type_name Only in desc_rec3 (varchar2(32767) and desc_rec4 (dbms_id))
col_type_name_len Only in desc_rec3 and desc_rec4

desc_tab

desc_tab is a collection (associative array) of desc_rec:
type desc_tab is table of desc_rec index by binary_integer;

See also

dbms_sql

Index