You can't bind a ref cursor using dbms_sql. But what you can do is convert a ref cursor to a dbms_sql cursor. Then you can describe the columns in that!
So call your procedure as normal. Then convert the returned cursor to a dbms_sql one:
declare
o1 sys_refcursor;
l1 varchar2( 1 ) := 'Y';
l2 varchar2( 1 );
l3 varchar2( 1 );
procedure desc_cursor ( cur sys_refcursor ) as
col_cnt pls_integer;
rec_tab dbms_sql.desc_tab;
rec_rec dbms_sql.desc_rec;
handle pls_integer;
begin
handle := dbms_sql.to_cursor_number(o1);
dbms_sql.describe_columns( handle, col_cnt, rec_tab );
<< loop1 >>
for i in 1..rec_tab.last loop
rec_rec := rec_tab( i );
dbms_output.put_line( rec_rec.col_name );
end loop loop1;
dbms_sql.close_cursor(handle);
end desc_cursor;
begin
dbms_output.put_line( '########### 1st call ###########' );
p1(o1, l1, l2, l3);
desc_cursor (o1);
dbms_output.put_line( '########### 2nd call ###########' );
l1 := null;
l3 := 'Y';
p1(o1, l1, l2, l3);
desc_cursor (o1);
end;
/
########### 1st call ###########
F1
F2
########### 2nd call ###########
F1
F2
F3
PS - the LiveSQL example works great. Though you don't need spend so much time to proving basic functionality ;)