Re: accessing currval(), How? ... Trigger? I think...???

From: Dmitry Tkach <dmitry(at)openratings(dot)com>
To: Ralph Rotondo <ralph(dot)rotondo(at)verizon(dot)net>
Subject: Re: accessing currval(), How? ... Trigger? I think...???
Date: 2003-02-11 20:00:13
Message-ID: 3E49564D.9090008@openratings.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Trigger functions can only take text as arguments (and have to be declared with no arguments at all) (surprise-surprise :-)
The upside though, is that they also have access to the tuples that triggered the execution... I think, something like this should
work (but not sure about the syntax - neevr used plpgsql):

create function contact_list_trigger() returns opaque as
'begin; insert into contact_lists (contact_id) values (new.id); return new; end;'
language 'plpgsql';

or (without using the "new.id"):

create function contact_list_trigger returns opaque as
'begin; insert into contact_lists(contact_id) values (currval(\'contact_id_seq\')); return new;end;'
language 'plpgsql';

... and then:

create trigger insert_contact_list after insert on contacts for each row execute procedure contact_list_trigger();

I hope, it helps...

Dima.

Ralph Rotondo wrote:
> Hello.
>
> I am in the process of porting some old db solutions into PostgreSQL. One
> thing I did alot in my old environment was:
>
> when creating a new record in table A
> automatically create a related record in table B
>
> Here's the example I'm trying to create.
>
> Table contacts has a PRIMARY key named contact_id (serial)
> - it gets it's value from nextval('"contact_id_seq"'::text)
>
> What I want to do is take the value used for contact_id by the sequence
> contact_id_seq and insert it into a matching field in table contact_lists,
> (In other words I want everybody entered in the db to get a contact_list
> assigned to them linked via their contact_id).
>
> I can do this from the commandline using:
>
> SELECT currval('"contact_id_seq"');
>
> I have had no success accessing the currval() function through PHP trying
> every possible combo of single & double quotes and have reached the
> conclusion that the currval() function is simply unreachable from outside
> postgres. So I tried to create a pl/pgsql function to be called by a
> trigger.
>
> Here is one of many attempts to make that work:
>
> CREATE FUNCTION "contact_list_trigger" (bigint) RETURNS opaque AS '
> declare
> curr_val alias for $1;
> begin
> insert into contact_lists (contact_id) values(currval);
> return new;
> end;
> ' LANGUAGE 'plpgsql';
>
> CREATE TRIGGER "insert_contact_list" AFTER INSERT ON "contacts" FOR EACH
> ROW EXECUTE PROCEDURE "contact_list_trigger" (
> 'currval("contact_id_seq")');
>
> ... And that's about as far as I can possibly take it. Any help at all would
> be greatly appriciated. Thank you.
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Fernando Schapachnik 2003-02-11 21:01:08 Sharing a transaction between programs.
Previous Message Tom Lane 2003-02-11 19:36:38 Re: Is Hash Agg being used? 7.4 seems to handle this query worse than 7.3