Thread: plpgsql handling a set of values

plpgsql handling a set of values

From
"pobox@verysmall.org"
Date:
I am writing a plpgsql (PostgreSQL 8.x) trigger function that should do
something on a number of records. The records are in a very simple table
with two columns - 'parent_id' and 'child_id'. A 'child' can be as well
a 'parent' to one or more children - in this case its ID appears as many
times in the 'parent_id' column as many children it has. The input the
plpgsql function gets is the ID of the top 'parent'. Then it should find
all children and do something with them.

I think I can do this in two ways -

a) load all record IDs in an array and than loop on it

b) do something like a WHILE cycle in which I select the records one by
one (using increasing offset) - and do the job within this WHILE cycle

The a) way seems easier to me but it might eat too much memory on large
trees (expected tree size is up to let's say 3 000 - 15 000 records).
The b) way seems the best way - I am only not sure if SELECT with
growing offset will work in this case.

I would be happy about some comments.

Thank you,
Iv

--

Re: plpgsql handling a set of values

From
"Merlin Moncure"
Date:
On 10/9/06, pobox@verysmall.org <pobox@verysmall.org> wrote:
> I am writing a plpgsql (PostgreSQL 8.x) trigger function that should do
> something on a number of records. The records are in a very simple table
> with two columns - 'parent_id' and 'child_id'. A 'child' can be as well
> a 'parent' to one or more children - in this case its ID appears as many
> times in the 'parent_id' column as many children it has. The input the
> plpgsql function gets is the ID of the top 'parent'. Then it should find
> all children and do something with them.

it's not exactly clear if you are asking about handling children
recursively or not (meaning, you have to find the children's children,
and so on).  If so, I'd suggest taking a look here:
http://people.planetpostgresql.org/merlin/index.php?/archives/2-Dealing-With-Recursive-Sets-With-PLPGSQL.html
which details one way of dealing with recursion in pl/pgsql.

if not, then you are dealing with a simple loop over a set.  more than
likely, this can be handled elegantly with a single query (usually the
best way).  then again, a standard loop might fit better and in this
case a for loop is often easiet:

for foovar in select * from foo
loop
  something := foo.bar;  --etc
end loop;

in this case the postgresql backend is pretty smart and this approach
can work with large sets -- although a single query will often be the
most efficient method.  ymmv

merlin

Re: plpgsql handling a set of values

From
"pobox@verysmall.org"
Date:
Merlin Moncure wrote:
 > it's not exactly clear if you are asking about handling children
 > recursively or not (meaning, you have to find the children's children,
 > and so on).  If so, I'd suggest taking a look here:
 >
http://people.planetpostgresql.org/merlin/index.php?/archives/2-Dealing-With-Recursive-Sets-With-PLPGSQL.html


Yes, this is exactly my case.

Thanks a lot!
Iv

Re: plpgsql handling a set of values

From
Alban Hertroys
Date:
pobox@verysmall.org wrote:
> I am writing a plpgsql (PostgreSQL 8.x) trigger function that should do
> something on a number of records. The records are in a very simple table
> with two columns - 'parent_id' and 'child_id'. A 'child' can be as well
> a 'parent' to one or more children - in this case its ID appears as many
> times in the 'parent_id' column as many children it has. The input the
> plpgsql function gets is the ID of the top 'parent'. Then it should find
> all children and do something with them.

I think you should have a look at the ltree contrib package. It
implements tree-like structures, and probably makes your problem much
simpler.

--
Alban Hertroys
alban@magproductions.nl

magproductions b.v.

T: ++31(0)534346874
F: ++31(0)534346876
M:
I: www.magproductions.nl
A: Postbus 416
    7500 AK Enschede

// Integrate Your World //

Re: plpgsql handling a set of values

From
"pobox@verysmall.org"
Date:
> I think you should have a look at the ltree contrib package. It
> implements tree-like structures, and probably makes your problem much
> simpler.

I have never used contrib modules with PostgreSQL - are they easy to
handle - I mean, especially upon upgrade, etc.

Re: plpgsql handling a set of values

From
"Merlin Moncure"
Date:
On 10/11/06, pobox@verysmall.org <pobox@verysmall.org> wrote:
> > I think you should have a look at the ltree contrib package. It
> > implements tree-like structures, and probably makes your problem much
> > simpler.
>
> I have never used contrib modules with PostgreSQL - are they easy to
> handle - I mean, especially upon upgrade, etc.

installation:
make && make install

upgrade issue is tricky.  their is a lower burden of backwards
compatibility than on in-core features.  for example, some of contrib
was gpl and is getting moved out/changed.  however, the more popular
modules, like tsearch are very well supported.  I haven't used ltree
module myself but on the surface it has some advantages and
disadvantages over the approach I suggested.  However, the authors,
namely Teodor Sigaev and Oleg Bartunov are some pretty amazing coders.

merlin

Re: plpgsql handling a set of values

From
"pobox@verysmall.org"
Date:
> installation:
> make && make install
>
> upgrade issue is tricky.  their is a lower burden of backwards
> compatibility than on in-core features.  for example, some of contrib
> was gpl and is getting moved out/changed.  however, the more popular
> modules, like tsearch are very well supported.  I haven't used ltree
> module myself but on the surface it has some advantages and
> disadvantages over the approach I suggested.  However, the authors,
> namely Teodor Sigaev and Oleg Bartunov are some pretty amazing coders.
>
> merlin

Thank you for the information.

I think your article on the BoM helped me solve the issue so far. I am
not that experienced and I prefer to stay on a stable ground as long as
I am not forced to move :)

Thanks again!
Iv