如何在另一个“插入”查询中使用“记录”类型的变量字段?

问题描述 投票:0回答:1

我有一个带有复合键的数据库,另一个表引用了该键。简化为网络主机及其端口之间的一个非常简单的示例(在该示例中省去了[[all不相关的内容”),结果变成这样:

host ---------+-------- scope | TEXT hostname | TEXT port ---------+-------- scope | TEXT <-- Referencing host.scope hostname | TEXT <-- Referencing host.hostname name | TEXT
我想避免在SQL脚本中复制scopehostname的值。因此,我认为可以编写和INSERT ... RETURNING ... INTO ...语句,然后在插入的端口中重用返回的记录。所以我提出了以下内容:

BEGIN; DO $$ DECLARE result RECORD; BEGIN CREATE TEMPORARY TABLE host ( scope TEXT, hostname TEXT ); CREATE TEMPORARY TABLE port ( scope TEXT, hostname TEXT, name TEXT ); INSERT INTO host (scope, hostname) VALUES ('scope-a', 'hostname') RETURNING (scope, hostname) INTO result; RAISE NOTICE 'result = %', result; INSERT INTO port (scope, hostname, name) VALUES (result.*, 'port-1'); END $$; ROLLBACK;

我已经考虑过使用单独的变量,这将起作用,但是当使用诸如RECORD的复合类型时,实际的脚本将在可读性和可维护性方面受益。

我也尝试过使用ROWTYPE,但是某些表包含NOT NULL约束,这在某种程度上阻止了我声明该类型的变量。]​​>

以上示例中的最终INSERT语句失败。 result.*语法是我盲目尝试过的,没有运气。因为它是“ RECORD”类型,所以PostgreSQL不知道结构,这可能是失败的原因。

有什么方法可以做到这一点?

我有一个带有复合键的数据库,另一个表引用了该键。简化为网络主机及其端口之间非常简单的示例(在此示例中,删除了所有无关紧要的内容),...

postgresql plpgsql
1个回答
1
投票
不使用record,但是两个值分别使用变量:
© www.soinside.com 2019 - 2024. All rights reserved.