Re: RECORD.* doesn't work in Pl/PGSQL

From: "Merlin Moncure" <mmoncure(at)gmail(dot)com>
To: "Gurjeet Singh" <singh(dot)gurjeet(at)gmail(dot)com>
Cc: "PGSQL Hackers" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: RECORD.* doesn't work in Pl/PGSQL
Date: 2008-04-22 22:50:40
Message-ID: b42b73150804221550l261da8feqf75f1c610c410344@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Apr 22, 2008 at 4:10 PM, Gurjeet Singh <singh(dot)gurjeet(at)gmail(dot)com> wrote:
> RECORD.* doesn't work in plpgsql, but NEW.* and OLD.* do in trigger
> functions created in plpgsql.
>
> The example function process_emp_audit() on page
> http://www.postgresql.org/docs/8.3/interactive/plpgsql-trigger.html , shows
> that we can use OLD.* and NEW.* as:
>
> INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
>
> but if I try to do the same thing in my own plpgsql function, it throws
> a runtime ERROR:
>
> create table t1( a int, b char );
> create table t2( a int, b char );
>
> create or replace function log_rotate() returns void as $$
> declare
> rec record;
> begin
>
> for rec in delete from t2 returning * loop
> insert into t1 select 1, rec.*; -- throws ERROR: record type has
> not been registered
> end loop;
>
> end;
> $$ language 'plpgsql';

you can do this:

create or replace function log_rotate() returns void as $$
declare
rec t1;
begin
for rec in delete from t2 returning 1, * loop
insert into t1 select rec.*;
end loop;
end;
$$ language plpgsql;

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2008-04-22 23:13:54 Re: WIP: psql default banner patch
Previous Message Alvaro Herrera 2008-04-22 22:11:26 Re: WIP: psql default banner patch