如何在PL/pgSQL中初始化rowtype数组?
声明并初始化PostgreSQL表行类型数组
在PostgreSQL中,你不能直接用(id=1, value='val 1')这种键值对格式构造表行类型的数组元素,需要使用行构造器并匹配表字段顺序来初始化。以下是两种可行的实现方式:
方法1:使用ROW()构造器+类型转换
通过ROW()创建行数据,再显式转换为目标表的行类型,最后组成数组:
do $$ declare rowsForTable mytable%rowtype[] := array [ ROW(1, 'val 1')::mytable%rowtype, ROW(2, 'val 2')::mytable%rowtype, ROW(3, NULL)::mytable%rowtype -- 未指定的字段用NULL填充 ]; begin -- 可选:验证数组内容 raise notice '%', rowsForTable; -- 后续插入表的示例语句 insert into mytable select * from unnest(rowsForTable); end; $$ language plpgsql;
方法2:直接用表名作为行构造器
PostgreSQL支持直接使用表名作为构造函数创建行实例,语法更简洁:
do $$ declare rowsForTable mytable%rowtype[] := array [ mytable(1, 'val 1'), mytable(2, 'val 2'), mytable(3, NULL) ]; begin -- 可选:验证数组内容 raise notice '%', rowsForTable; -- 后续插入表的示例语句 insert into mytable select * from unnest(rowsForTable); end; $$ language plpgsql;
注意事项
- 行构造器的参数必须严格匹配表字段的定义顺序,如果某个字段不需要指定值,对应位置用
NULL填充(比如示例中第三个元素的value字段)。 - 虽然
id是serial类型,但这里是手动赋值初始化数组;如果需要让序列自动生成id,可以去掉数组中的id值,插入时只指定value字段。
内容的提问来源于stack exchange,提问作者BUKTOP
相关产品推荐
相关产品推荐

