Hubert 'depesz' Lubaczewski:等待 PostgreSQL 17 —— 在 plpgsql 中允许 %TYPE 和 %ROWTYPE 后跟数组修饰符。

💡 原文英文,约400词,阅读约需2分钟。
📝

内容提要

2024年1月4日,Tom Lane提交了一个补丁,允许在plpgsql中使用%TYPE和%ROWTYPE后面跟数组修饰符。这提供了一个有用的功能,可以声明一个变量,该变量是另一个变量或表列的类型的数组。这个功能很酷,但可能不会被广泛使用。现在,我们可以很容易地将变量定义为%TYPE或%ROWTYPE的数组。这个功能允许将记录集存储在变量中,以便以后可以重复使用。

🔎

延伸解读

补丁的核心变化

此前在 PL/pgSQL 中,%TYPE 和 %ROWTYPE 只能用于声明单个变量,无法直接声明其数组类型。2024 年 1 月 4 日 Tom Lane 提交的补丁允许在这两个伪类型后添加数组修饰符([]),从而可以声明“某列类型的数组”或“某表行类型的数组”。这填补了类型声明上的一个空白,使变量定义更灵活。

实际用法示例

文章用 DO 块演示了新语法:v_all_db_names 声明为 pg_database.datname%TYPE[],v_all_dbs 声明为 pg_database%ROWTYPE[]。通过 SELECT array_agg(...) INTO 将查询结果存入这两个数组变量,随后用 raise notice 输出。这表明可以方便地把一组列值或整行记录聚合到变量中,便于后续重复使用。

适用场景与局限

该功能适合需要将记录集暂存到变量并多次处理的场景,例如在 PL/pgSQL 块中先收集数据再循环或传递。作者认为它“很酷”,但可能不会广泛使用,因为多数日常操作可直接用查询或临时表完成。此外,数组元素类型仍依赖数据库对象定义,若表结构变更,变量类型会随之调整。

❓

Q&A

PostgreSQL 17 中 plpgsql 的 %TYPE 和 %ROWTYPE 数组修饰符是什么?

这是 Tom Lane 于 2024 年 1 月 4 日提交的补丁,允许在 plpgsql 中让 %TYPE 和 %ROWTYPE 后跟数组修饰符,从而声明一个变量,其类型是某个变量或表列类型的数组。

这个新功能解决了之前 plpgsql 的什么限制?

在此之前,无法轻松地将变量定义为 %TYPE 或 %ROWTYPE 的数组;现在可以方便地声明这种数组变量。

如何在 plpgsql 中声明一个 %TYPE 的数组变量?

例如:v_all_db_names pg_database.datname%TYPE[]; 这样 v_all_db_names 就是 pg_database.datname 类型的数组。

如何在 plpgsql 中声明一个 %ROWTYPE 的数组变量?

例如:v_all_dbs pg_database%ROWTYPE[]; 这样 v_all_dbs 就是 pg_database 表行类型的数组。

这个新功能有什么实际用途?

可以轻松地将记录集存储在变量中,以便后续重复使用;虽然之前也能实现,但方式不够优雅。

这个功能会被广泛使用吗?

作者认为这个功能很酷,但可能不会得到广泛使用。

🏷️

标签

➡️

继续阅读