Re: pg/plsql question - Mailing list pgsql-general

From Ragnar Hafstað
Subject Re: pg/plsql question
Date
Msg-id 1110909643.26975.47.camel@localhost.localdomain
Whole thread Raw
In response to Re: pg/plsql question  (Fred Blaise <fred.blaise@excilan.com>)
Responses Re: pg/plsql question  (Fred Blaise <fred.blaise@excilan.com>)
List pgsql-general
On Tue, 2005-03-15 at 18:18 +0100, Fred Blaise wrote:
> While I have accomplished what I needed with the pgedit script given by
> John, I am still curious as to why mine is not working...
> Here is the latest version:
>
> /* */
> create or replace function fred_on_all() RETURNS integer AS '
> declare
>         v_schema varchar;
>         v_user varchar;
>         v_t varchar;
> begin
>         v_user := ''user'';
>         v_schema := ''public'';
>         FOR v_t in select tablename from pg_catalog.pg_tables where
> schemaname = v_schema
>         LOOP
>                 raise notice ''v_t is %'', t;
>         END LOOP;
>         return 1;
> end;
> ' LANGUAGE 'plpgsql';
>
> Please note that all ticks above are single ticks.
>
> Here is what I do to execute it:
> excilan=# \i grant.sql
> CREATE FUNCTION
> excilan=# select fred_on_all();
> ERROR:  missing ".." at end of SQL expression
> CONTEXT:  compile of PL/pgSQL function "fred_on_all" near line 8

taken from
http://www.postgresql.org/docs/7.4/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

<quote>
Note:  The PL/pgSQL parser presently distinguishes the two kinds of FOR
loops (integer or query result) by checking whether the target variable
mentioned just after FOR has been declared as a record or row variable.
If not, it's presumed to be an integer FOR loop. This can cause rather
nonintuitive error messages when the true problem is, say, that one has
misspelled the variable name after the FOR. Typically the complaint will
be something like missing ".." at end of SQL expression.
</quote>

try (untested):

create or replace function fred_on_all() RETURNS integer AS '
declare
        v_schema varchar;
        v_user varchar;
        v_rec RECORD;
begin
        v_user := ''user'';
        v_schema := ''public'';
        FOR v_rec in select tablename from pg_catalog.pg_tables where
schemaname = v_schema
        LOOP
                raise notice ''v_t is %'', v_REC.tablename;
        END LOOP;
        return 1;
end;
' LANGUAGE 'plpgsql';

gnari



pgsql-general by date:

Previous
From: Michael Fuhr
Date:
Subject: Re: plpython function problem workaround
Next
From: Michael Fuhr
Date:
Subject: Re: Wierd error message