Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Data Bases > Pgsql General > Re: How to crea...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 3 of 6 Topic 15504 of 17437
Post > Topic >>

Re: How to create a function with multiple RefCursor OUT

by cbai22@[EMAIL PROTECTED] (Chuck Bai) May 12, 2008 at 10:29 PM

The following is a function from PosgreSQL do***entation to return 
multiple cursors from a single function:

CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
    OPEN $1 FOR SELECT * FROM table_1;
    RETURN NEXT $1;
    OPEN $2 FOR SELECT * FROM table_2;
    RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;

-- need to be in a transaction to use cursors.
BEGIN;

SELECT * FROM myfunc('a', 'b');

FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;


What I want to achieve is to modify the function to take an INOUT 
parameter. For example:
myfunc(INOUT tcount integer, refcursor, refcursor). I want to add logic 
to my INOUT parameter inside the function and return it back to client, 
as well as returning the two refcursor results. How to modify this 
function and how to test it in SQL to achieve my goal?

Merlin Moncure wrote:
> On Sun, May 11, 2008 at 2:43 PM, Chuck Bai <cbai22@[EMAIL PROTECTED]
> wrote:
>   
>>  CREATE OR REPLACE FUNCTION test_refcursor(INOUT tcount integer, OUT
o_user
>> refcursor, OUT o_name refcursor)
>>   RETURNS record AS
>>  $BODY$
>>  BEGIN
>>    tcount := tcount + 1;
>>    OPEN o_user FOR SELECT * FROM user_table;
>>    OPEN o_name FOR SELECT * FROM name_table;
>>  END;
>>  $BODY$
>>   LANGUAGE 'plpgsql' VOLATILE
>>
>>  Question 1: The function is not working with Npgsql .NET data
provider. It
>> did not return a valid .NET DataSet. But the INOUT parameter tcount
works
>> fine. How could I test the above function with SQL in pgAdmin III? I
want to
>> find out if problem is in the function or in the Npgsql.
>>     
>
> You can test from pgAdmin by simply running queries in the query
> window.  This sort of thing however might be a better fit for psql
> (pasting your queries in the query window).  You need to use
> transactions since refcursors only only good inside a transaction.
>
>   
>>  Question 2: pgAdmin III automatically added "RETURNS record" in the
above
>> function when RETURNS clause is not specified initially. Why is that?
Is
>> this the problem since it returns only single data table with the
following
>> value? How to fix it?
>>     
>
> For a function with >1 out parameters, the output type is a record.
> Your function returns (int, refcursor, refcursor) as defined.  SELECT
> * FROM test_refcursor(7); would returns a row with three variables ( a
> record).
>
>   
>>  tcount  o_user  o_name
>>  23      <unnamed ****tal 1>      <unnamed ****tal 2>
>>     
>
> You probably want to name your refcursors.  The way to do this is
> simply o_user := 'something'; inside your pl/pgsql function.
>
> -- inside pl/pgsql_function
> refcur_variable := 'mycursor'
>
> -- outside function, but in same transaction
> FETCH ALL FROM mycursor -- or, "mycursor"
>
> So, it would at least take a few 'queries' from the perppective of the
> client to do what you are attempting.  However, all the data is 'set
> up' for return to the client by the server in the main function.  The
> server will hang on to it as long as the current transaction is valid
> and then release it.
>
>   
>>  Question 3: I want to return a single DataSet with each OUT RefCursor
map
>> to a DataTable within the DataSet,  plus extra OUT parameters for
individual
>> OUT values. How could I create such a function?
>>     
>
> Your question is a little opaque to me.  A refcursor is in PostgreSQL
> terms a 'hande' to a set, not a DataTable the way you are
> thinking...it's really a fancy string.  so, (INOUT int, OUT refcursor,
> OUT refcursor) returns takes an 'int' in and returns an int and two
> refcursors (strings), with extra work to return this to the client, at
> least in terms of SQL statements.
>
> I haven't used .net for a while but IIRC it's probably not possible to
> 'fill' multiple data tables in a single query without at least some
> manual work.  Some of the npgsql experts might have some suggestions
> however.  It really depends on how the code operates inside the npgsql
> library.
>
> merlin
>
>   


-- 
Sent via pgsql-general mailing list (pgsql-general@[EMAIL PROTECTED]
)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general
 




 6 Posts in Topic:
How to create a function with multiple RefCursor OUT parameters
cbai22@[EMAIL PROTECTED]   2008-05-11 14:43:23 
Re: How to create a function with multiple RefCursor OUT paramet
mmoncure@[EMAIL PROTECTED  2008-05-12 11:09:29 
Re: How to create a function with multiple RefCursor OUT
cbai22@[EMAIL PROTECTED]   2008-05-12 22:29:01 
Re: How to create a function with multiple RefCursor OUT paramet
laurenz.albe@[EMAIL PROTE  2008-05-13 08:19:34 
Re: How to create a function with multiple RefCursor OUT
cbai22@[EMAIL PROTECTED]   2008-05-15 22:55:47 
Re: How to create a function with multiple RefCursor OUT paramet
francisco@[EMAIL PROTECTE  2008-05-17 02:38:16 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Sat Nov 22 13:09:34 CST 2008.