Re: insert rowtype
От | Bryan Klimt |
---|---|
Тема | Re: insert rowtype |
Дата | |
Msg-id | DBDAE5D0-8173-11D7-B60D-000A95774E48@baylor.edu обсуждение исходный текст |
Ответ на | insert rowtype (Bryan Klimt <Bryan_Klimt@baylor.edu>) |
Список | pgsql-sql |
So, to answer my own question... I wanted to duplicate a row, but change a few data items in it. Here is an example table to demonstrate: # select oid,* from test; oid | id | tmstamp | description -------+----+---------------------+------------- 20396 | 1 | 0000-00-00-00-00-00 | hello 20397 | 2 | 0000-00-00-00-00-00| goodbye 20398 | 2 | 0000-00-00-00-00-01 | goodbye I wanted to create a new row like this: oid | id | tmstamp | description -------+----+---------------------+------------- 20396 | 1 | 0000-00-00-00-00-00 | hello 20397 | 2 | 0000-00-00-00-00-00| goodbye 20398 | 2 | 0000-00-00-00-00-01 | goodbye 20415 | 2 | 1111-00-00-00-00-02 | goodbye But with my real table there are like 50 columns, and i didn't want to retype all their names. So, I created this function: create or replace function updatetest(integer,varchar(32)) returns integer as'declare -- the oid of the new row newoid integer;begin -- duplicate the row insert into test select * from test t where t.tmstamp=( select max(tt.tmstamp) from test tt where tt.id=t.id ) and t.id=$1; -- get the oid of the new duplicate get diagnostics newoid = result_oid; -- update the columns you want to change update test set tmstamp=$2 where oid=newoid; -- return the new oid return newoid;end;' language plpgsql; # select updatetest(2,'1111-00-00-00-00-02'); updatetest ------------ 20415 I know it looks kinda obvious but it took me forever to figure it out. Specifically, "get diagnostics newoid = result_oid;" is not very obvious to plpgsql newbies. -Bryan
В списке pgsql-sql по дате отправления: