У меня есть объект на стороне клиента, который содержит список вторичных объектов, и он представлен в БД как ограничение внешнего ключа.
Форма создания на стороне клиента позволяет создавать оба основных объектаи его дочерние объекты сразу, поэтому на стороне 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.
Есть лиспособ использовать одну многострочную вставку, или я должен просто вернуться к вставке значений один за другим?Я предполагаю, что многострочная вставка на самом деле не просто многократно выполняет однострочную вставку, и что было бы полезно использовать ее по сравнению с подходом один за другим.Конечно, я бы предпочел избегать искаженных обходных путей, которые замедляли бы работу за пределы выгоды, которую дает многорядная вставка.