pl-pgsql, recursion and cursor contexting - Mailing list pgsql-general

From Gauthier, Dave
Subject pl-pgsql, recursion and cursor contexting
Date
Msg-id 0836165E8EE50F40A3DD8F0D8713726701215BB7@azsmsx421.amr.corp.intel.com
Whole thread Raw
Responses Re: pl-pgsql, recursion and cursor contexting  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: pl-pgsql, recursion and cursor contexting  ("Pavel Stehule" <pavel.stehule@gmail.com>)
List pgsql-general

Hi:

 

I’m in the business of writting recursive PL-Pgsql functions.  I need to know what happens to the data stream from a select cursor inside of which the recursive call is made.  For example....

 

 

 

create table int_stream (num integer);

insert into int_stream (num) values (1);

insert into int_stream (num) values (2);

insert into int_stream (num) values (3);

insert into int_stream (num) values (4);

insert into int_stream (num) values (5);

 

create or replace function my_factorial(integer) returns insteger as $$

 

  in_int alias for $1;

  x integer;

  rec record;

 

begin

 

  if(in_int = 1) then

    return(1);

  end if;

 

  for rec in    select num from int_stream where num <= in_int

  loop

    x := in_int * my_factorial(in_int - 1);

  end loop;

 

  return(x);

end;

$$ language plpgsql;

 

This comes up witht he right answer.  IOW, making the recursive call from within the “for rec in...” loop doesn’t seem to destroy the data streams from earlier calls.  I just need to make sure that this will always be the case and that getting the correct result in this example is not just an artifact of it’s simplicity.  I know, for example, this was a no-no in Oracle.  You had to stuff arrays with the resuts from looping in cursors, and then make the recursive call in a subsaquent loop on the arrays.

 

Thanks

-dave

 

 

pgsql-general by date:

Previous
From: Simon Riggs
Date:
Subject: Re: pg_start_backup() takes too long
Next
From: Tom Lane
Date:
Subject: Re: pl-pgsql, recursion and cursor contexting