PostgreSQL - множественная вставка в хранимую процедуру - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть объект на стороне клиента, который содержит список вторичных объектов, и он представлен в БД как ограничение внешнего ключа.

Форма создания на стороне клиента позволяет создавать оба основных объектаи его дочерние объекты сразу, поэтому на стороне DB может потребоваться сохранить как новый основной объект, так и некоторые новые дочерние объекты в одной транзакции.По этой причине я хотел бы использовать сторону хранимой процедуры на стороне хранимой процедуры, и самый непосредственный подход, по-видимому, заключается в передаче полей основного объекта в качестве аргументов, а дочерних объектов - в качестве аргумента коллекции некоторого вида(вероятно, строка json, чтобы учесть неоднородность данных дочерних объектов).

В моей хранимой процедуре сначала я сохраню основной объект, затем я сохраню дочерние объекты, возможно сделависпользование только что созданного идентификатора основного объекта (как я понимаю, сама процедура как транзакция, и сбой после записи основного объекта приведет к откату указанной вставки / обновления).

Моя проблема заключаетсяпри сохранении дочерних сущностей (отсюда просто "сущности").Хотя я понимаю, что для существующих сущностей , Мне нужно запускать каждое обновление самостоятельно , но я хотел бы использовать многострочный синтаксис вставки для новой сущности.По этой причине я хочу создать подготовленный оператор, в котором я могу увеличить список вставленных кортежей, так как длина списка сущностей может изменяться, как в INSERT INTO ... VALUES <tuple1>, <tuple2>, ..., и тут возникает боль ...

Конечно, было бы проще всего просто объединить необработанные значения из каждой сущности для построения строки запроса, это вызывает внедрение SQL.

С другой стороны, хотя я могу построить оператор вставки с использованием нотации $, у меня возникнет проблема при его выполнении с подключением параметров, а именно:

-- prepare insert statement stmt

EXECUTE stmt USING <???> -- variable number of parameters to wire, 
                         -- I don't know how to work around it.

Есть лиспособ использовать одну многострочную вставку, или я должен просто вернуться к вставке значений один за другим?Я предполагаю, что многострочная вставка на самом деле не просто многократно выполняет однострочную вставку, и что было бы полезно использовать ее по сравнению с подходом один за другим.Конечно, я бы предпочел избегать искаженных обходных путей, которые замедляли бы работу за пределы выгоды, которую дает многорядная вставка.

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете упаковать кортежи в json[] и отменить их в операторе INSERT, но я не вижу в этом смысла.

Я бы просто запустил однорядные операторы INSERTдля каждой сущности.

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

Кроме того, я быожидайте, что код станет чище и проще в обслуживании с помощью простых INSERT s в цикле.

...