Re: plpgsql update row from record variable

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: plpgsql update row from record variable
Дата
Msg-id 57013768.8030401@aklaver.com
обсуждение исходный текст
Ответ на plpgsql update row from record variable  (Seamus Abshere <seamus@abshere.net>)
Список pgsql-general
On 04/02/2016 06:07 PM, Seamus Abshere wrote:
> hi,
>
> I want to write a function that updates arbitrary columns and here's my
> pseudocode:
>
> CREATE OR REPLACE FUNCTION update_pet(id int, raw_data jsonb) RETURNS
> VOID AS $$
> DECLARE
>    data record;
> BEGIN
>    SELECT jsonb_populate_record(null::pets, raw_data) INTO data;
>    UPDATE pets [... from data ...] WHERE id = id; -- probably impossible
> END;
> $$ LANGUAGE plpgsql;
>
> e.g.
>
> SELECT update_pets(1, '{ "name" : "Jerry", "age": 9 }'::jsonb);
>
> Back in 2004, Tom showed how to insert from a plpgsql record:
>
> http://www.postgresql.org/message-id/17840.1087670348@sss.pgh.pa.us
>
> Is there any way to "update *" from a record?

What version of Postgres?

In 9.5 you have the following syntax available:

http://www.postgresql.org/docs/9.5/interactive/sql-update.html

UPDATE accounts SET (contact_first_name, contact_last_name) =
     (SELECT first_name, last_name FROM salesmen
      WHERE salesmen.id = accounts.sales_id);

or its almost(see docs for notes) pre-9.5 equivalent:

UPDATE accounts SET contact_first_name = first_name,
                     contact_last_name = last_name
   FROM salesmen WHERE salesmen.id = accounts.sales_id;


So on a 9.4 instance here:

test=# \d company
        Table "public.company"
  Column  |     Type      | Modifiers
---------+---------------+-----------
  id      | integer       | not null
  name    | text          | not null
  age     | integer       | not null
  address | character(50) |
  salary  | real          |
Indexes:
     "company_pkey" PRIMARY KEY, btree (id)


UPDATE
     company
SET
     salary = jb.salary
FROM
     (
     SELECT
         id,
         salary
     FROM
         jsonb_populate_record ( NULL::company,
         '{"id": 1, "age": 32, "name": "Paul", "salary": 10000,
           "address": "California"}' ::jsonb ) )
     AS
         jb
WHERE
     company.id = jb.id;


>
> Thanks!
> Seamus
>
> PS. Whether I **should** do this is another matter, I just want to know
> if it's possible.
>
> --
> Seamus Abshere, SCEA
> https://github.com/seamusabshere
> http://linkedin.com/in/seamusabshere
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


В списке pgsql-general по дате отправления:

Предыдущее
От: Soni M
Дата:
Сообщение: Re: CORRUPTION on TOAST table
Следующее
От: Adrian Klaver
Дата:
Сообщение: Re: CORRUPTION on TOAST table