You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 西畑大吾

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:01:15