Re: call stored function from ecpg w/cursor

From: Andrew Jarcho <ajarcho(at)nyc(dot)rr(dot)com>
To: Michael Fuhr <mike(at)fuhr(dot)org>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: call stored function from ecpg w/cursor
Date: 2007-05-01 22:26:35
Message-ID: 4637BE9B.4070609@nyc.rr.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

Michael Fuhr wrote:
> On Tue, May 01, 2007 at 03:03:58AM -0400, Andrew Jarcho wrote:
>
>> Thank you for your continued help. A stripped down but fully
>> (mal)functioning version of the code is attached. The error, according
>> to the logfile ecpg_debug.log, occurs in the file callProcsViaC.pgc and
>> is clearly marked there. A lot of the included code is just for
>> completeness/reference.
>>
>
> The ms_getInvolvedInCase() function returns a composite type.
> Instead of
>
> EXEC SQL DECLARE c_1 CURSOR FOR SELECT ms_getInvolvedInCase(:mstsCaseID);
>
> try
>
> EXEC SQL DECLARE c_1 CURSOR FOR SELECT * FROM ms_getInvolvedInCase(:mstsCaseID);
>
>
Hi Michael--
Thank you very much for your kind assistance; that solved the problem,
which has occupied me all day for several days.

I made a change to the code, however, and although it now appears to
work correctly, it produces an error very similar to the one I was
getting before. It also produces a warning on compile. The error, raised
by ECPGdebug, is -202 'Too few arguments in line 51'. The compile-time
warning, cut and pasted from the output, is:

WARNING: cursor `c_1´ has been declared but ot opened (sic).

The change I made was to alter the function stored in the db so that it
returns a refcursor, and adjust my ecpg code accordingly. The cursor is
declared using:

EXEC SQL DECLARE c_1 CURSOR FOR SELECT
ms_getInvolvedInCase(:mstsCaseID, refcursor);

and instantiated using:

EXEC SQL SELECT ms_getInvolvedInCase(:mstsCaseID, 'c_1');

The stored function is coded as

CREATE OR REPLACE FUNCTION ms_getInvolvedInCase (cID INTEGER,
REFCURSOR) RETURNS REFCURSOR AS $$

BEGIN
OPEN $2 FOR
SELECT ACR.logname, A.lastName, A.firstName, ACR.role
FROM ms_account A, ms_accountCaseRole ACR
WHERE ACR.caseID = cID AND
ACR.logname = A.logname;

RETURN $2;

END;

$$ LANGUAGE plpgsql;

and tuples are retrieved using:

EXEC SQL FETCH NEXT FROM c_1 INTO :lognm:lognm_ind,
:lastnm:lastnm_ind, :firstnm:firstnm_ind,
:rol:rol_ind;

inside a loop.

I'm afraid to use this code (updated version attached) because of the
error messages, although it works. As before, I'm compiling with gcc,
and linking with g++, on a Solaris UNIX system running PostgreSQL 8.0.3.
I'd appreciate any help you can give me.
Yours,
--Andy J.

Attachment Content-Type Size
newProblem.tar.gz application/gzip 4.8 KB

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message Andrew Jarcho 2007-05-02 01:08:49 Re: call stored function from ecpg w/cursor
Previous Message Michael Fuhr 2007-05-01 14:05:59 Re: call stored function from ecpg w/cursor