Friday 30 January 2009

Oracle : Display refcursor content in SqlPlus or Toad

Proc to xml-ify the refcursor

create or replace procedure refcursor_print (p_refcursor in sys_refcursor,
                 p_null_handling in number := 0)
as
  l_xml      xmltype;
  l_context  dbms_xmlgen.ctxhandle;
  l_clob     clob;

  l_null_self_argument_exc exception;
  pragma exception_init (l_null_self_argument_exc, -30625);
 
  procedure print (p_msg in varchar2)
  as
    l_text varchar2(32000) := p_msg;
  begin
    loop
      exit when l_text is null;
      dbms_output.put_line(substr(l_text,1,250));
      l_text:=substr(l_text, 251);
    end loop;
  end print;
begin
  /*
  Purpose:    print debug information (ref cursor)
  Remarks:    outputs weakly typed cursor as XML
  */

  /* get a handle on the ref cursor */
  l_context:=dbms_xmlgen.newcontext (p_refcursor);
  /*
  # DROP_NULLS CONSTANT NUMBER:= 0; (Default) Leaves out the tag for NULL elements.
  # NULL_ATTR CONSTANT NUMBER:= 1; Sets xsi:nil="true".
  # EMPTY_TAG CONSTANT NUMBER:= 2; Sets, for example, <foo/>.
  */
  /* how to handle null values */
  dbms_xmlgen.setnullhandling (l_context, p_null_handling);
  /* create XML from ref cursor */
  l_xml:=dbms_xmlgen.getxmltype (l_context, dbms_xmlgen.none);

  print('Number of rows in ref cursor: ' || dbms_xmlgen.getnumrowsprocessed (l_context));
 
  begin
    l_clob:=l_xml.getclobval();
    print('Size of XML document (anything over 32K will be truncated): ' || length(l_clob));
    print(substr(l_clob,1,32000));
  exception
    when l_null_self_argument_exc then
       print('Empty dataset.');
  end;
end ;

Call like this
Nb returns a refcursor into c1
Output via dbms_output

c1 sys_refcursor;

begin
   get_refcursor_with_some_params('X1001',TO_DATE('12/02/2008','DD/MM/YYYY'),c1);
  refcursor_print(c1);
end;


0 comments: