Как избежать нескольких обновлений для значений столбца по умолчанию?

Я хочу вставить запись в хранимую функцию с необязательными параметрами и вернуть вставленную запись.

Таблица:

CREATE TABLE partner (
    id serial NOT NULL,
    name text NOT NULL,
    status text not null default 'internal',
    active bool not NULL DEFAULT true
);

Обратите внимание, что статус и активность столбцов имеют значения по умолчанию.

Функция Store имеет как обязательные, так и необязательные параметры.

create or replace function addPartner(pname text, pstatus text = null, pactive bool = null) returns partner as $$
declare
  newrecord partner;
begin
  insert into partner
    (name)
    values(pname)
    returning * into newrecord;
  if pactive is not null then
    update partner set active = pactive where id = newrecord.id returning * into newrecord;
  end if;
  if pstatus is not null then
    update partner set status = pstatus where id = newrecord.id returning * into newrecord;
  end if;
  return newrecord;
end;
$$ language plpgsql;

И вызов функции будет следующим:

select * from addPartner('customer A', 'external', false);
select * from addPartner('customer B', 'external');
select * from addPartner('customer C');

select * from partner;

В случае вызова функции со всеми параметрами («Клиент A») мне нужно выполнить вставку записи с требуемыми параметрами и значениями по умолчанию для дополнительных параметров, а после этого для каждого дополнительного параметра (или столбца со значением по умолчанию ) выполнить обновление для необязательных значений параметров. Всего 1 вставка и 2 обновления.

Я хочу избежать этих множественных обновлений внутри хранимой функции и вставить новую запись в один оператор SQL, если это возможно.

Один оператор вставки со значениями параметров или значениями по умолчанию, если необязательные параметры опущены.

Ссылка с предыдущим кодом на rextester: https://rextester.com/POZM9812

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использовать динамический SQL: https://rextester.com/UGA76790

create or replace function addPartner(pname text, pstatus text = null, pactive bool = null) returns partner as $$
declare
  newrecord partner;
  statement TEXT;
begin
  statement := FORMAT(
      'INSERT INTO partner (name, status, active) VALUES ($1, %s, %s) RETURNING *',
      COALESCE(QUOTE_LITERAL(pstatus), 'DEFAULT'),
      COALESCE(QUOTE_LITERAL(pactive), 'DEFAULT')
  );

  EXECUTE statement
  INTO newrecord
  USING pname;

  return newrecord;
end;
$$ language plpgsql;

Другие вопросы по теме