Thread: plpgsql setof help

plpgsql setof help

From
"Matthew T. O'Connor"
Date:
Hello, I'm trying to write a pl/pgsql function that takes in a column 
(setof?) of text values and returns an english language list, for example:

if "select towns from towns_table;" retuned
town1
town2
town3

I want the following:
select column_to_english_list( select towns from towns_table );

to return:
'town1, town2 and town3'

In order to do this, I think I would have to create a pl/pgsql function 
that accpts a setof text argument, but I'm not sure that's allowed.  
Anyone care to comment?

Thank you,

Matthew O'Connor



Re: plpgsql setof help

From
Tom Lane
Date:
"Matthew T. O'Connor" <matthew@zeut.net> writes:
> I want the following:
> select column_to_english_list( select towns from towns_table );

> to return:
> 'town1, town2 and town3'

> In order to do this, I think I would have to create a pl/pgsql function 
> that accpts a setof text argument, but I'm not sure that's allowed.  

Well, if you are okay with writing

select column_to_english_list( 'select towns from towns_table' );

(ie, pass the subquery as a string) then you could do something
involving FOR ... IN EXECUTE $1.

I wonder though if it wouldn't be better to recast the problem as an
aggregate:

select column_to_english_list(towns) from towns_table;

probably using text[] as the transition state, and having the
transition function just accumulate all the words into the array
and then the final function decides where to plaster commas and
"and"s.

You can find examples of similar aggregates in the PG archives, IIRC.
        regards, tom lane


Re: plpgsql setof help

From
Frank Bax
Date:
Tom Lane wrote:
> "Matthew T. O'Connor" <matthew@zeut.net> writes:
>> I want the following:
>> select column_to_english_list( select towns from towns_table );
> 
>> to return:
>> 'town1, town2 and town3'
> 
> I wonder though if it wouldn't be better to recast the problem as an
> aggregate:
> 
> select column_to_english_list(towns) from towns_table;
> 
> probably using text[] as the transition state, and having the
> transition function just accumulate all the words into the array
> and then the final function decides where to plaster commas and
> "and"s.
> 
> You can find examples of similar aggregates in the PG archives, IIRC.


Actually; an example is in docs:

http://www.postgresql.org/docs/8.3/static/xaggr.html

use array_accum(); then reformat final text (to remove {} and change 
last comma to 'and').