Re: refcursor returned by pl/psql to jdbc - SUCESSS - Mailing list pgsql-jdbc

From Richard Emberson
Subject Re: refcursor returned by pl/psql to jdbc - SUCESSS
Date
Msg-id 3CB5E355.98890CED@phc.net
Whole thread Raw
In response to Re: refcursor returned by pl/psql to jdbc  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: refcursor returned by pl/psql to jdbc - SUCESSS  (Dave Cramer <Dave@micro-automation.net>)
List pgsql-jdbc
Thanks all.

CREATE OR REPLACE FUNCTION user_data_select_all(BIGINT)
RETURNS REFCURSOR AS '
DECLARE
    -- parameters
    owner_id_p ALIAS FOR $1;

    -- local variables
    rc REFCURSOR;
BEGIN
    OPEN rc FOR SELECT *
        FROM user_data
        WHERE
            owner_id = owner_id_p;
    RETURN rc;
END;
' LANGUAGE 'plpgsql' WITH (isstrict);


            Statement stmt = conn.createStatement();
                ResultSet res =
                  stmt.executeQuery("begin; SELECT user_data_select_all("
                                +userId.toString()+");");
                res.next();
                String cn = res.getString(1);
                res = stmt.executeQuery("fetch all in \"" +cn +"\";");

                while (res.next()) {
                        Long ownerId = new Long(res.getLong(1));
..............

With the above procedure and JDBC code ... it works. (you can also pass in a
"named" cursor)

Last question, is the db cursor closed when the Java statement is closed?
Which is to say, can one do the above without any dead objects being left in
memory/disk in
the db backend?

One last thing, this is not optimum since it requres two trips to the db from the
process/machine
runing the Java JDBC code ... a way of doing this with a single query would be
better.

Richard



Dave Cramer wrote:

> Richard,
>
> OK, sorry for being so obtuse before... The driver really doesn't know
> what to do with a cursor just yet ;(
>
> What you can do though is use a named cursor, but you will have to name
> it in the plpgsql function and pass it in through the query.
>
> Don't return the cursor (or anything else for that matter) from the
> function, the driver doesn't know what to do with it, or if you do want
> to get it then use getString...
>
> Now use fetch to actually get the rows, since it returns a resultset
>
> Let me know how this works for you.
>
> P.S. It occurs to me that you could obtain the same information hiding
> with a view ???
>
> Dave
>
>
>
> On Thu, 2002-04-11 at 14:21, Richard Emberson wrote:
> > I name the cursor and the name is returned to JDBC .... but JDBC is expecting
> > a resultset.
> >
> > CREATE OR REPLACE FUNCTION user_data_select_all(BIGINT, REFCURSOR)
> > RETURNS REFCURSOR AS '
> > DECLARE
> >     -- parameters
> >     owner_id_p ALIAS FOR $1;
> > BEGIN
> >     OPEN $2 FOR SELECT *
> >         FROM user_data
> >         WHERE
> >             owner_id = owner_id_p;
> >     RETURN $2;
> > END;
> > ' LANGUAGE 'plpgsql' WITH (isstrict);
> >
> >             Statement stmt = conn.createStatement();
> >             try {
> >
> >                 String cursorName = "XXXX";
> >                 stmt.setCursorName(cursorName);
> >                 ResultSet res =
> >                   stmt.executeQuery("begin; SELECT user_data_select_all("
> >                                +userId.toString()+",'"
> >                                 +cursorName +"');");
> >
> >                 while (res.next()) {
> >                         Long ownerId = new Long(res.getLong(1));
> > ................
> >
> >
> > Bad Long XXXX
> >         at org.postgresql.jdbc2.ResultSet.toLong(ResultSet.java:1498)
> >         at org.postgresql.jdbc2.ResultSet.getLong(ResultSet.java:257)
> >
> >
> > Bruce Momjian wrote:
> >
> > > Dave Cramer wrote:
> > > > Richard,
> > > >
> > > > The problem is that the cursor is un-named. Is there a way to name the
> > > > cursor? jdbc doesn't know what to do with a column named <unnamed cursor
> > > > 1>
> > >
> > > Yes, you can name the cursor.  See my new doc section at the bottom of:
> > >
> > >         http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html
> > >
> > > You have to pass the cursor name into the function.
> > >
> > > --
> > >   Bruce Momjian                        |  http://candle.pha.pa.us
> > >   pgman@candle.pha.pa.us               |  (610) 853-3000
> > >   +  If your life is a hard drive,     |  830 Blythe Avenue
> > >   +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
> >
> >


pgsql-jdbc by date:

Previous
From: Richard Emberson
Date:
Subject: Re: refcursor returned by pl/psql to jdbc
Next
From: Dave Cramer
Date:
Subject: Re: refcursor returned by pl/psql to jdbc - SUCESSS