Thread: problem with plpgsql function

problem with plpgsql function

From
Alex Guryanow
Date:
Hi,

I have a table "isbn" (postgres-7.0.2) with two columns:

   book_id int4
   isbn varchar(20)

I want to create a function that joins all isbn for specified book_id.
The code of this function is:

   CREATE FUNCTION all_isbn2( int4 ) RETURNS varchar AS 'DECLARE
   i isbn%ROWTYPE;
   res varchar;
   BEGIN res := "";
   FOR i IN SELECT * FROM isbn WHERE isbn.book_id = $1 LOOP
   res := res || i.isbn;
   END LOOP;
   RETURN res;
   END;' LANGUAGE 'plpgsql';

But when i execute the query

book=> select all_isbn2(1);

I receive the following error:

ERROR:  Attribute '' not found

What I'm doing wrong?

Regards,
Alex



Re: problem with plpgsql function

From
Tom Lane
Date:
Alex Guryanow <gav@nlr.ru> writes:
>    CREATE FUNCTION all_isbn2( int4 ) RETURNS varchar AS 'DECLARE
>    i isbn%ROWTYPE;
>    res varchar;
>    BEGIN res := "";
>    FOR i IN SELECT * FROM isbn WHERE isbn.book_id = $1 LOOP
>    res := res || i.isbn;
>    END LOOP;
>    RETURN res;
>    END;' LANGUAGE 'plpgsql';

> ERROR:  Attribute '' not found

> What I'm doing wrong?

You need to write
    BEGIN res := '''';
Double quotes "" imply a variable or column name, not a string literal.
You need 4 quotes not 2 because you're inside a ' literal already
(you could also write res := \'\' if that seems clearer).

It occurs to me that we ought to make a push to consistently use
double-quotes not single-quotes in error messages that are reporting
names.  If the error had been
    ERROR:  Attribute "" not found
you might've figured out your mistake without help...

            regards, tom lane