Обсуждение: Help with a plperl function

Поиск
Список
Период
Сортировка

Help with a plperl function

От
Alex
Дата:
Hi,
i am having a problem with a plperl function. bellow function always
returns me an error saying "elements of Perl result array must be
reference to hash"

Can anyone point me out what i am doing wrong here?
Basically i try to return data from a select in a specific record format.
(i know that bellow example does not require a function, just want to
get a feel for it.)

Thanks in advance for any tips.

Alex


DROP FUNCTION get_item ();
DROP TYPE my_items;

CREATE TYPE my_items AS (
  item_id             INTEGER,
  description         TEXT,
  order_date          DATE);

CREATE FUNCTION get_item () RETURNS SETOF my_items AS $$

  my $res = [];
  my $rv = spi_exec_query('SELECT * FROM items LIMIT 10');

  my $nrows = $rv->{processed};
    foreach my $rn (0 .. $nrows - 1) {

        my $row = $rv->{rows}[$rn];
        my @record;

        $record[0] = $row->{item_id};
        $record[1] = $row->{item_descr};
        $record[2] = $row->{start_date};

        push @$res, @record;
    }
    return $res;


$$ LANGUAGE plperl;


Re: Help with a plperl function

От
Michael Fuhr
Дата:
On Tue, Apr 19, 2005 at 03:00:07AM +1000, Alex wrote:
>
> i am having a problem with a plperl function. bellow function always
> returns me an error saying "elements of Perl result array must be
> reference to hash"
[snip]
>        my $row = $rv->{rows}[$rn];
>        my @record;
>
>        $record[0] = $row->{item_id};
>        $record[1] = $row->{item_descr};
>        $record[2] = $row->{start_date};
>
>        push @$res, @record;

You should be pushing a hash reference, not an array.  Try something
like this:

    my $row = $rv->{rows}[$rn];

    push @$res, {item_id     => $row->{item_id},
                 description => $row->{item_descr},
                 order_date  => $row->{start_date}};

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

Re: Help with a plperl function

От
Harald Fuchs
Дата:
In article <4263E797.8000500@meerkatsoft.com>,
Alex <alex@meerkatsoft.com> writes:

> Hi,
> i am having a problem with a plperl function. bellow function always
> returns me an error saying "elements of Perl result array must be
> reference to hash"

> Can anyone point me out what i am doing wrong here?
> Basically i try to return data from a select in a specific record format.
> (i know that bellow example does not require a function, just want to
> get a feel for it.)

> Thanks in advance for any tips.

> Alex


> DROP FUNCTION get_item ();
> DROP TYPE my_items;

> CREATE TYPE my_items AS (
>   item_id             INTEGER,     description         TEXT,
> order_date          DATE);

> CREATE FUNCTION get_item () RETURNS SETOF my_items AS $$
>   my $res = [];
>   my $rv = spi_exec_query('SELECT * FROM items LIMIT 10');
>   my $nrows = $rv->{processed};
>     foreach my $rn (0 .. $nrows - 1) {
>         my $row = $rv->{rows}[$rn];
>         my @record;
>         $record[0] = $row->{item_id};
>         $record[1] = $row->{item_descr};
>         $record[2] = $row->{start_date};
>         push @$res, @record;

This is the culprit.  You should instead use something like

push @$res, {
  item_id     => $row->{item_id},
  description => $row->{item_descr},
  order_date  => $row->{start_date},
};