如何在PostgreSQL中通过游标为带属性的数组索引赋值?
PostgreSQL中实现带属性的数组赋值(从Oracle迁移)
你当前的错误核心是:把数组定义成text[],但text类型没有cur_name/cur_value这类属性。PostgreSQL需要先定义带属性的自定义记录类型,再基于这个类型创建数组。
解决步骤
- 定义自定义记录类型(可在函数内部或全局创建)
- 声明对应类型的数组变量
- 修正游标循环的赋值逻辑,PostgreSQL的FOR循环中,循环变量直接代表游标返回的行记录,数组扩展可使用
array_append或手动维护索引
完整示例代码
CREATE FUNCTION function_name () RETURNS void AS $$ DECLARE -- 1. 在函数内部定义带属性的记录类型 TYPE rec_type IS RECORD ( cur_name text, cur_value text ); -- 2. 声明该类型的数组变量 array1 rec_type[]; -- 定义游标 cursor1 CURSOR FOR SELECT name, value FROM "table"; BEGIN -- 初始化空数组 array1 := '{}'::rec_type[]; FOR loop1 IN cursor1 LOOP -- 3. 将当前行记录追加到数组 array1 := array_append(array1, loop1); -- 若需手动指定索引,可替换为: -- array1[array_length(array1, 1) + 1] := loop1; END LOOP; -- 后续访问数组元素属性示例 -- IF array_length(array1, 1) > 0 THEN -- RAISE NOTICE '第一个元素名称:%', array1[1].cur_name; -- END IF; RETURN; END; $$ LANGUAGE plpgsql;
补充说明
- 若需要全局复用该类型,可在函数外创建:
之后函数内直接声明CREATE TYPE rec_type AS ( cur_name text, cur_value text );array1 rec_type[]即可。 - 原代码中
array1[loop].cur_name属于语法错误,PostgreSQL数组索引为数字,且需确保对应位置有元素,array_append是最安全的数组扩展方式。 - 游标循环中,
loop1已包含当前行的name和value值,无需通过cursor1.name访问,直接用loop1整体赋值即可。
内容的提问来源于stack exchange,提问作者Nishihata Daigo 西畑大吾
相关产品推荐
相关产品推荐

