Да, вот оно. Для этого вам даже не нужен 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.