Please don't top post!
Chuck Bai 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.
>>
>> psql is easier, but you can also issue SQL commands with pgAdmin III:
>>
>> test=> BEGIN;
>> BEGIN
>> test=> SELECT * FROM test_refcursor(42);
>> tcount | o_user | o_name
>> --------+--------------------+--------------------
>> 43 | <unnamed portal 3> | <unnamed portal 4>
>> (1 row)
>>
>> test=> FETCH ALL FROM "<unnamed portal 3>";
>> ....
>> ....
>> (n rows)
>>
>> test=> FETCH ALL FROM "<unnamed portal 4>";
>> ....
>> ....
>> (m row)
>>
>> test=> COMMIT;
>> COMMIT
>>
>> So it looks to me like your funktion works well.
>
> Thank you Albe. I test your script using psql and it works as you found
> out. If the function is correct. Now the problem is how to use the
> function from client side. It could not use "<unnamed portal #>" kind of
> thing from client. I tested the function using Npgsql connector and it
> did not work. I got only thing like "43 | <unnamed portal 3> | <unnamed
> portal 4>" returned as a single row to my .NET client. Any other clients
> can use the function? Please advise.
Easy as pie.
If you have trouble with unnamed cursors, name them:
CREATE OR REPLACE FUNCTION test_refcursor(INOUT tcount integer,
OUT o_user refcursor, OUT o_name refcursor) RETURNS record AS
$BODY$
BEGIN
o_user := 'o_user';
o_name := 'o_name';
tcount := tcount + 1;
OPEN o_user FOR SELECT * FROM user_table;
OPEN o_name FOR SELECT * FROM name_table;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
Yours,
Laurenz Albe