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

news/2024/7/9 22:01:36 标签: postgresql, 数据库

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

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

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

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

user_id users.user_id%TYPE;
user_row users%ROWTYPE;

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

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

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


http://www.niftyadmin.cn/n/5342688.html

相关文章

NQA测试机制—UDP Jitter测试

概念 UDP Jitter是以UDP报文为承载,通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter(抖动时间)是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。 UDP Jitter测试的过程如下: 1. 源端&a…

RabbitMQ中交换机的应用 ,原理 ,案例的实现

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ中交换机的应用及原理,案…

轻松上手:通过阿里云PAI QuickStart微调部署Qwen-72B-Chat模型

作者:熊兮、求伯、一耘 引言 通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上…

宝塔+nextcloud+docker+Onlyoffice 全开启https

折腾了我三天的经验分享 1.宝塔创建网站 nextcloud版本为28.0.1 php8.2 ,导入nextcloud绑定域名对应的证书 ,不用创建mysql 因为nextcloud 要求是mariadb:10.7 宝塔里没有,就用docker安装一个 端口设置为3307 将数据库文件映射出来/ww…

基于python的网页自动化工具:DrissionPage

简介 DrissionPage 是一个基于 python 的网页自动化工具。它既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和 requests 的高效率。它功能强大,内置无数人性化设计和便捷功能。它的语法简洁而优雅&#xff…

【AIGC】CLIP

CLIP的基本原理 对比学习: Clip使用对比学习来训练模型。对比学习的目标是通过将正样本(相似的图像和文本对)与负样本(不相似的图像和文本对)进行比较,从而使模型学会区分不同样本之间的差异。这有助于模型…

网络协议与攻击模拟_06攻击模拟SYN Flood

一、SYN Flood原理 在TCP三次握手过程中, 客户端发送一个SYN包给服务器服务端接收到SYN包后,会回复SYNACK包给客户端,然后等待客户端回复ACK包。但此时客户端并不会回复ACK包,所以服务端就只能一直等待直到超时。服务端超时后会…

关于C#中的HashSet<T>与List<T>

HashSet<T> 表示值的集合。这个集合的元素是无须列表&#xff0c;同时元素不能重复。由于这个集合基于散列值&#xff0c;不能通过数组下标访问。 List<T> 表示可通过索引访问的对象的强类型列表。内部是用数组保存数据&#xff0c;不是链表。元素可重复&#xf…