Thread: Why this does not work ??

Why this does not work ??

From
Roberto Rezende de Assis
Date:
Hello all, why this does not work ?

-----------------------------------------
create table original(num int);
-----------------------------------------
create table copia(num int);
-----------------------------------------
insert into original(num) values (1);
insert into original(num) values (2);
insert into original(num) values (3);
-----------------------------------------
create function copiar()
    returns int as '
    declare
        ponteiro int;
    begin
        for ponteiro in select * from original order by num asc loop
            insert into copia(num) values(ponteiro);
        end loop;
        return 1;
    end;
    ' language plpgsql;
-----------------------------------------
-----------------------------------------
-----------------------------------------
This are the results
teste=# \i for.sql
CREATE TABLE
CREATE TABLE
INSERT 127676 1
INSERT 127677 1
INSERT 127678 1
CREATE FUNCTION
teste=# select copiar();
WARNING:  plpgsql: ERROR during compile of copiar near line 4
ERROR:  missing .. at end of SQL expression
teste=#



Re: Why this does not work ??

From
Tom Lane
Date:
Roberto Rezende de Assis <rezende_assis@yahoo.com.br> writes:
> Hello all, why this does not work ?

> create function copiar()
>     returns int as '
>     declare
>         ponteiro int;
>     begin
>         for ponteiro in select * from original order by num asc loop
>             insert into copia(num) values(ponteiro);

The loop variable of a for/select loop has to be a record or rowtype
variable.  So you should do something like

    declare
        r record;
    begin
        for r in select * from original order by num asc loop
            insert into copia(num) values(r.num);

> WARNING:  plpgsql: ERROR during compile of copiar near line 4
> ERROR:  missing .. at end of SQL expression

I agree that this error message is not very helpful :-(

            regards, tom lane

Re: Why this does not work ?? (Now it has worked)

From
Roberto Rezende de Assis
Date:
Thank you all, that one here is the one that worked
declarer record;
beginfor r in select * from original order by num asc loop	insert into copia(num) values(r.num);end loop;
end;

Re: Why this does not work ??

From
Tom Lane
Date:
I wrote:
> The loop variable of a for/select loop has to be a record or rowtype
> variable.  So you should do something like

>     declare
>         r record;
>     begin
>         for r in select * from original order by num asc loop
>             insert into copia(num) values(r.num);

>> WARNING:  plpgsql: ERROR during compile of copiar near line 4
>> ERROR:  missing .. at end of SQL expression

> I agree that this error message is not very helpful :-(

FYI, I have just committed some fixes that will hopefully provide more
helpful error messages for erroneous FOR-loops.  Your example will
draw

ERROR:  loop variable of loop over rows must be a record or row variable

in PG 7.5.

            regards, tom lane

Re: Why this does not work ??

From
Markus Bertheau
Date:
В Сбт, 03.07.2004, в 23:56, Tom Lane пишет:
> Roberto Rezende de Assis <rezende_assis@yahoo.com.br> writes:
> > Hello all, why this does not work ?
>
> > create function copiar()
> >     returns int as '
> >     declare
> >         ponteiro int;
> >     begin
> >         for ponteiro in select * from original order by num asc loop
> >             insert into copia(num) values(ponteiro);
>
> The loop variable of a for/select loop has to be a record or rowtype
> variable.  So you should do something like
>
>     declare
>         r record;
>     begin
>         for r in select * from original order by num asc loop
>             insert into copia(num) values(r.num);
>
> > WARNING:  plpgsql: ERROR during compile of copiar near line 4
> > ERROR:  missing .. at end of SQL expression
>
> I agree that this error message is not very helpful :-(

FWIW, the documentation explicitly states this case and the unhelpful
error message it yields.

I haven't looked, but the docs would need fixing then, too.

Thanks.

--
Markus Bertheau <twanger@bluetwanger.de>


Re: Why this does not work ??

From
Jason Davis
Date:
>Hello all, why this does not work ?
>
>-----------------------------------------
>create table original(num int);
>-----------------------------------------
>create table copia(num int);
>-----------------------------------------
>insert into original(num) values (1);
>insert into original(num) values (2);
>insert into original(num) values (3);
>-----------------------------------------
>create function copiar()
>    returns int as '
>    declare
>        ponteiro int;
>    begin
>        for ponteiro in select * from original order by num asc loop
>            insert into copia(num) values(ponteiro);
>        end loop;
>        return 1;
>    end;
>    ' language plpgsql;
>-----------------------------------------
>-----------------------------------------
>-----------------------------------------

Try this...

create function copiar()
    returns int as '
    declare
        ponteiro record;
    begin
        for ponteiro in select * from original order by num asc loop
            insert into copia(num) values(ponteiro.num);
        end loop;
        return 1;
    end;
    ' language plpgsql;

cheers
Jason