Chuck Bai wrote: > I have the following function: > > 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. > 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? It is unnecessary to have "RETURNS record", but it is not a problem. It just means: "returns something". You do not need to fix it. > tcount o_user o_name > 23 <unnamed portal 1> <unnamed portal 2> > > > 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? DataSet and DataTable ate .NET things, so you'd better ask on the Npgsql forum. What keeps you from adding extra OUT parameters? Yours, Laurenz Albe