如何在另一个 "insert" 查询中使用 "record" 类型变量的字段?

How can I use fields of a variable of type "record" in another "insert" query?

我有一个带有复合键的数据库,另一个 table 引用了该键。简化为网络主机及其端口之间的一个非常简单的示例(省略了 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,但是一些 table 包含 NOT NULL 约束,这不知何故阻止我声明具有该类型的变量。

上例中最后的 INSERT 语句失败。 result.* 语法是我盲目尝试的,没有任何运气。因为它是 "RECORD" 类型,PostgreSQL 不知道结构,这可能是失败的原因。

有什么方法可以实现吗?

不要使用 record,而是为两个值使用单独的变量:

INSERT INTO host ...
   RETURNING scope, hostname INTO v_scope, v_hostname;

INSERT INTO port (scope, hostname, name)
   VALUES (v_scope, v_result, 'port-1');