Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> Re: Howto generate records in stored procedure

Re: Howto generate records in stored procedure

From: Daniel Morgan <dmorgan_at_exesolutions.com>
Date: Mon, 16 Sep 2002 15:54:18 GMT
Message-ID: <3D85FE76.640EC172@exesolutions.com>


Jan van Toor wrote:

> Daniel,
>
> I didn't explain the problem correctly. I am not very experienced with
> Oracle. I am trying to convert a solution, I built with Borland's Interbase,
> to Oracle.
>
> In Interbase you can define a kind of output-record for a stored procedure.
> Based upon data of one or more tables, you can fabricate your own records.
> Everytime you execute an SUSPEND-command, a record is added to the
> resultset. In Interbase I would read from a cursor and give three
> SUSPEND-commands for every record read.
>
> A calling program can read this output as if it where a real table.
>
> Is this also possible with Oracle?
>
> Kind regards
> Jan van Toor
>
> "Daniel Morgan" <dmorgan_at_exesolutions.com> schreef in bericht
> news:3D820676.A88A7657_at_exesolutions.com...
> > Jan van Toor wrote:
> >
> > > Hi guys,
> > >
> > > I have got to write a stored procedure, which reads the contents of a
> table.
> > > For every record read, three identical records must be generated in a
> > > resultset (or temp table?). The resultset is connected to a REF CURSOR
> in a
> > > package.
> > >
> > > I work with Oracle7, so a lot of goodies like temp tables and
> Object-types
> > > can't be used.
> > > Do you know a solution? A code-snippet would be highly appreciated!
> > >
> > > Thanks in advance,
> > > Jan van Toor
> >
> > Temp tables are irrelevant to what you are trying to do. Just open a
> cursor,
> > fetch the record, and then follow the fetch with your three inserts.
> Easily done
> > in version 7. No need for anything fancy.
> >
> > But you are working with REF CURSORS in Oracle 7? Really?
> >
> > Daniel Morgan
> >

I've no experience with InterBase other than receiving some promotional stuff from Borland ages ago so this is just a guess. But what I think you are looking for is a REF CURSOR. A ref cursor can be declared to hold multiple rows of data with those rows defined by a SELECT statement. So for example from one of my classroom exmaples:

   TYPE t_ref_cursor IS REF CURSOR;

END;
/


BEGIN
   OPEN p_return_cur FOR
   'SELECT * FROM all_tables WHERE rownum <= ' || p_NumRecs ;

 END child;
 /


p_retcur uw_type.t_ref_cursor;
at_rec all_tables%ROWTYPE;

BEGIN
   child(pNumRecs, p_retcur);

   FOR i IN 1 .. pNumRecs
   LOOP

      FETCH p_retcur
      INTO at_rec;

      DBMS_OUTPUT.PUT_LINE(at_rec.table_name ||
      ' - ' || at_rec.tablespace_name ||
      ' - ' || TO_CHAR(at_rec.initial_extent) ||
      ' - ' || TO_CHAR(at_rec.next_extent));
   END LOOP;
END parent;
/

And as the example demonstrates ... the ref cursor can be passed from procedure to procedure or, similarly to a calling program be it a web interface, VB, Crystal Reports, etc.

Hope this helps. Well that and I hope I understood what you were asking too.

Daniel Morgan Received on Mon Sep 16 2002 - 10:54:18 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US