PostgreSQL - 在存储过程中多次插入

PostgreSQL - multiple insert within stored procedure

我有一个包含辅助实体列表的客户端实体,这在数据库中表示为外键约束。

客户端创建形式允许同时创建主实体和它的子实体,因此在数据库端可能必须在一个事务中同时保存一个新的主实体和一些新的子实体。出于这个原因,我想使用一个 存储过程数据库端 ,最直接的方法似乎是将主实体的字段作为参数传递,将子实体作为一个集合某种参数(可能是 json 字符串,以说明子实体数据的异质性)。

在我的存储过程中,首先我会保存主实体,然后我会保存子实体,可能会使用新生成的主实体 ID(据我所知,过程本身作为事务,写入主要实体后失败会回滚说 insertion/update)。

我的问题在于保存子实体(从这里开始 "entities")。虽然我明白,对于现有实体我需要运行每个更新自己,我想使用 multi - 新实体的行插入语法。出于这个原因,我想构建一个准备好的语句,我可以在其中增加插入元组的列表,因为实体列表的长度可能会有所不同,如 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.

有没有办法使用单个多行插入,或者我应该回退到逐个插入值?我假设多行插入实际上并不只是重复执行单行插入,并且与一对一的方法相比,使用它会有一些好处。当然,我宁愿避免扭曲的变通办法,这些变通办法会减慢操作速度,超出多行插入所带来的好处。

您可以将元组打包在 json[] 中,然后在 INSERT 语句中对其进行解析,但我真的不明白这一点。

我只想 运行 每个实体的单行 INSERT 语句。

我猜你担心性能,但也许所有的解析和反解析会超过在一个语句中插入所有内容的优势。

除此之外,我希望代码在循环中使用简单的 INSERTs 更清晰、更易于维护。