pgsql-general@postgresql.org

Started by Anton Andreevalmost 19 years ago3 messagesgeneral
Jump to latest
#1Anton Andreev
fn30762@fmi.uni-sofia.bg

Hi,

I am trying to use cursors and I am really frustrated already. Do I
need to install an extension?

1. Problem number one is that what ever I use in front of the fetch
command it is not being accepted, it gives a syntax error. If I use a
number ,"all" or "forward" it gives an error again?????????? I want to
do something like the code below:

CREATE OR REPLACE FUNCTION database_correction()
RETURNS double precision AS
$BODY$
DECLARE
mycursor CURSOR FOR select distinct(fund_id) from
"NAV_values_bfb_history";
iterator integer;

BEGIN
open mycursor;

FETCH mycursor INTO iterator;

--fetch next from mycursor --gives an error

WHILE (FETCH next from mycursor) LOOP
-- some computations here
END LOOP;

CLOSE mycursor;
END;

2. What is the right way to check that the cursor has ended. In
sqlserver there is a variable "@@fetch_status". I have to make here some
comparison in the while clause, but I am not sure what it should be. I
could not find a single example for cursor in a loop.

I will greatly appreciate any help, pgsql is my database of choice.

Cheers,
Anton

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Anton Andreev (#1)
Re: pgsql-general@postgresql.org

Anton Andreev wrote:

Hi,

I am trying to use cursors and I am really frustrated already. Do I
need to install an extension?

No, you just need to have a look at the docs.
http://www.postgresql.org/docs/8.2/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

1. Problem number one is that what ever I use in front of the fetch
command it is not being accepted, it gives a syntax error. If I use a
number ,"all" or "forward" it gives an error again?????????? I want to
do something like the code below:

CREATE OR REPLACE FUNCTION database_correction()
RETURNS double precision AS
$BODY$
[...]

Try something like this:

CREATE OR REPLACE FUNCTION database_correction()
RETURNS double precision LANGUAGE plpgsql AS
$body$
DECLARE
fund INTEGER;
BEGIN
FOR fund IN SELECT DISTINCT(fund_id) FROM "NAV_values_bfb_history" LOOP
RAISE NOTICE $$ foo bar $$;
-- some computations here
END LOOP;
RETURN 42.0;
END;
$body$;

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#3Albe Laurenz
all@adv.magwien.gv.at
In reply to: Anton Andreev (#1)
Re: pgsql-general@postgresql.org

I am trying to use cursors and I am really frustrated already. Do I
need to install an extension?

No, it's all in the documentation:
http://www.postgresql.org/docs/current/static/plpgsql-control-structures
.html#PLPGSQL-RECORDS-ITERATING

1. Problem number one is that what ever I use in front of the fetch
command it is not being accepted, it gives a syntax error. If I use a
number ,"all" or "forward" it gives an error again?????????? I want to
do something like the code below:

CREATE OR REPLACE FUNCTION database_correction()
RETURNS double precision AS
$BODY$
DECLARE
mycursor CURSOR FOR select distinct(fund_id) from
"NAV_values_bfb_history";
iterator integer;

BEGIN
open mycursor;

FETCH mycursor INTO iterator;

--fetch next from mycursor --gives an error

WHILE (FETCH next from mycursor) LOOP
-- some computations here
END LOOP;

CLOSE mycursor;
END;

My suggestion:

$BODY$
DECLARE
a_row RECORD;
BEGIN
FOR a_row IN SELECT DISTINCT(fund_id) FROM "NAV_values_bfb_history"
LOOP
-- some computations here
-- access the value as "a_row.fund_id"
END LOOP;
END;
$BODY$

2. What is the right way to check that the cursor has ended. In
sqlserver there is a variable "@@fetch_status". I have to make here

some

comparison in the while clause, but I am not sure what it should be. I
could not find a single example for cursor in a loop.

You do not need that at all, the loop will be left if there are no more
results.

Yours,
Laurenz Albe