PostgreSQL 17新特性:PL/pgSQL支持数组%TYPE以及%ROWTYPE

正在开发中的 PostgreSQL 17 即将增加一个新功能:PL/pgSQL 支持定义伪类型 %TYPE以及%ROWTYPE 数组。

当我们使用 PL/pgSQL 编写存储过程或者函数时,可以定义不同类型的变量。例如:

sql 复制代码
user_id integer;
quantity numeric(5);
url varchar;
myrow tablename%ROWTYPE;
myfield tablename.columnname%TYPE;
arow RECORD;

在此基础上,我们可以通过 %TYPE 以及 %ROWTYPE 定义伪类型,例如:

sql 复制代码
user_id users.user_id%TYPE;
user_row users%ROWTYPE;

变量 user_id 的类型基于字段 users.user_id 的类型,user_row 的类型基于表 users 的行类型。这种伪类型的好处是表的字段类型发生变化时,代码不需要改动。

PostgreSQL 17 开始,我们可以定义这种伪类型的数组变量,例如:

sql 复制代码
DO $$
DECLARE
    v_all_db_names pg_database.datname%TYPE[];
    v_all_dbs pg_database%ROWTYPE[];
BEGIN
    SELECT array_agg(datname) INTO v_all_db_names FROM pg_database;
    SELECT array_agg(d) INTO v_all_dbs FROM pg_database d;
    raise notice 'All db names = %', v_all_db_names;
    raise notice 'All dbs = %', v_all_dbs;
END;
$$;

NOTICE:  ALL db names = {postgres,template1,template0,pgdba,depesz}
NOTICE:  ALL dbs = {"(5,postgres,10,6,c,f,t,f,-1,728,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.37,)","(1,template1,10,6,c,t,t,f,-1,728,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.37,\"{=c/pgdba,pgdba=CTc/pgdba}\")","(4,template0,10,6,c,t,f,f,-1,728,1,1663,en_US.UTF-8,en_US.UTF-8,,,,\"{=c/pgdba,pgdba=CTc/pgdba}\")","(16462,pgdba,10,6,c,f,t,f,-1,728,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.37,)","(16473,testdb,16384,6,c,f,t,f,-1,728,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.37,)"}
DO

其中,v_all_db_names 变量是一个字符串数组,元素的类型锚定了 pg_database.datname 的类型。v_all_dbs 是一个行数组,元素的类型锚定了 pg_database%ROWTYPE 行类型。

相关推荐
PSLoverS7 分钟前
c++如何读取和修改可执行文件的PE头信息_IMAGE_NT_HEADERS解析【进阶】
jvm·数据库·python
阿丰资源12 分钟前
基于SpringBoot的房产销售系统设计与实现(附源码+数据库+文档,一键运行)
数据库·spring boot·后端
gmaajt14 分钟前
React Native 单元测试中第三方依赖的正确 Mock 策略
jvm·数据库·python
a95114164219 分钟前
宝塔面板数据库查询响应慢_利用慢查询日志进行优化
jvm·数据库·python
l1t34 分钟前
DeepSeek总结的面向 PostgreSQL 分析和 HTAP 工作负载的两种高性能表访问方法
数据库·postgresql
九皇叔叔34 分钟前
MySQL 8.x 隔离级别调整
数据库·mysql·事务·隔离级别
许愿OvO37 分钟前
Redis 7.4.8高可用集群实战:主从复制+哨兵+Cluster全解析
数据库·redis·bootstrap
2401_8314194437 分钟前
如何用 http 模块创建一个基础的 Web 服务器处理请求
jvm·数据库·python
pele37 分钟前
Redis如何防止AOF文件无限增大_触发BGREWRITEAOF命令进行日志重写
jvm·数据库·python
qq_4142565737 分钟前
golang如何设计HTTP中间件链_golang HTTP中间件链设计方法
jvm·数据库·python