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 行类型。

相关推荐
机器人梦想家20 分钟前
具身机器人视觉服务的异步回调与并发控制
数据库·算法·机器人
小妖同学学AI1 小时前
开源向量数据库的王者:Milvus 深度解析,专为 AI 应用打造的云原生搜索引擎!
数据库·开源·milvus
l1258651 小时前
# RAG上线评估指标体系:六大核心指标与压测实战全解析
数据库·人工智能·python·mysql·langchain·milvus
Wang's Blog1 小时前
PostgreSQL笔记48: 全文检索与向量检索的对比与混合检索实践
笔记·postgresql·全文检索
一只鹿鹿鹿2 小时前
数据资产管理解决方案(Word文件)
大数据·数据库·安全·web安全·系统安全
2401_894915532 小时前
Geo 优化源码部署实战:环境配置、参数调优完整指南
运维·服务器·数据库·tcp/ip·安全
FfHUCisI2 小时前
Golang database/sql 标准库基础
数据库·sql·golang
zhanghaha13142 小时前
Python进阶教程:13_math 模块 —— 新手完全指南
数据库·python·机器学习
__zRainy__2 小时前
Node系列 · 数据库:单表查询
数据库·后端·mysql·node.js
xcLeigh2 小时前
聊聊数据库迁移工具怎么从单机走向“云+端+服务”,KDMS架构拆解
数据库·架构·数据库迁移·kes·kdms·架构拆解