Обсуждение: cursor "x" does not exist
Hello,
My apologies if I'm being incredibly stupid here, but I've reviewed
what the docs have to say about naming portals and I still can't see
where I'm going wrong here ?
CREATE FUNCTION blah(v_id text,v_cursor refcursor) RETURNS refcursor
AS
$BODY$
BEGIN
OPEN v_cursor FOR SELECT * FROM blah where idcol=v_id;
RETURN v_cursor;
END;
$BODY$
LANGUAGE plpgsql;
The select query in here does return data, so I know the output from
below is certainly expected to return something.
BEGIN;
SELECT blah('A','B');
blah
--------------------------
B
(1 row)
FETCH ALL IN B;
ERROR: cursor "b" does not exist
P.S. As a side-question, if anyone here has experience in using
Postgres as a backend to PHP, are refcursors the way to go or should I
be thinking of SETOF or other return styles ?
Bob Jones <r.a.n.d.o.m.d.e.v.4+postgres@gmail.com> writes:
> My apologies if I'm being incredibly stupid here, but I've reviewed
> what the docs have to say about naming portals and I still can't see
> where I'm going wrong here ?
I think you're forgetting to double-quote an upper case identifier.
> FETCH ALL IN B;
> ERROR: cursor "b" does not exist
The cursor is named "B" not "b", but B without quotes folds to the latter.
regards, tom lane
On 14 April 2018 at 16:38, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Bob Jones <r.a.n.d.o.m.d.e.v.4+postgres@gmail.com> writes: >> My apologies if I'm being incredibly stupid here, but I've reviewed >> what the docs have to say about naming portals and I still can't see >> where I'm going wrong here ? > > I think you're forgetting to double-quote an upper case identifier. > >> FETCH ALL IN B; >> ERROR: cursor "b" does not exist > > The cursor is named "B" not "b", but B without quotes folds to the latter. > > regards, tom lane Thank you tom for showing me the error in my ways. Now where's that dunce cap gone ? Maybe I don't deserve to use anything better than MySQL. ;-)
On 04/14/2018 09:36 AM, Bob Jones wrote: > On 14 April 2018 at 16:38, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> Bob Jones <r.a.n.d.o.m.d.e.v.4+postgres@gmail.com> writes: >>> My apologies if I'm being incredibly stupid here, but I've reviewed >>> what the docs have to say about naming portals and I still can't see >>> where I'm going wrong here ? >> >> I think you're forgetting to double-quote an upper case identifier. >> >>> FETCH ALL IN B; >>> ERROR: cursor "b" does not exist >> >> The cursor is named "B" not "b", but B without quotes folds to the latter. >> >> regards, tom lane > > > Thank you tom for showing me the error in my ways. > > Now where's that dunce cap gone ? Maybe I don't deserve to use > anything better than MySQL. ;-) Or read the below and be illuminated:) https://www.postgresql.org/docs/10/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS > > -- Adrian Klaver adrian.klaver@aklaver.com
Hello Bob, On Sat, 2018-04-14 at 15:44 +0100, Bob Jones wrote: > Hello, > > > > P.S. As a side-question, if anyone here has experience in using > Postgres as a backend to PHP, are refcursors the way to go or should > I > be thinking of SETOF or other return styles ? > If you have a business requirement along the lines of "display all outstanding orders for a customer" it is best to create a view that serves that purpose. Then all you need to code is a "select * from v_outstanding_orders where customer_id = $1"; If there are any outstanding orders you can page through the associative array returned by the query in order to display the results. HTH, Rob