Пользовательская функция: вставить объект в таблицу - PullRequest
0 голосов
/ 03 августа 2020

У меня в базе данных postgres есть следующая функция:

create function my_schema.create_my_book(book my_schema.book) returns my_schema.book as $$
declare
  v_book my_schema.book;
begin
  insert into my_schema.book(title, language) values (book.title, book.language) returning * into v_book;
  return v_book;
end;
$$ language plpgsql volatile;

Таким образом, мне нужно ввести все имена столбцов (title, language) и значения (book.title, book.language). Моя таблица с книгами довольно большая, так что это сильно взорвет мой код, и как только я добавлю столбец, мне придется не забыть добавить его и в эту функцию.

Есть ли способ напрямую вставить весь book my_schema.book объект?

1 Ответ

1 голос
/ 03 августа 2020

Да, вот оно. Для этого вам даже не нужен plpg sql, простой sql подойдет (и работает быстрее).

create or replace function my_schema.create_my_book(arg_book my_schema.book)
returns my_schema.book as
$$
  insert into my_schema.book select arg_book.* returning *;
$$ language sql volatile;

Я изменил имя аргумента на arg_book, чтобы избежать возможной двусмысленности. И поскольку тип arg_book равен my_schema.book, этот простой код адаптируется к изменению таблицы и продолжает работать.

Для решения проблемы с идентификатором

create or replace function my_schema.create_my_book(arg_book my_schema.book)
returns my_schema.book as
$$
declare
  v_book my_schema.book%rowtype;
begin
  arg_book.id := nextval('the-id-sequence-name'); 
  insert into my_schema.book select arg_book.* returning * into v_book;
  return v_book;
end;
$$ language plpgsql volatile;

что довольно близко к вашей исходной функции, просто динамика c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...