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

PostgreSQL创建接收数组参数遍历插入数据的自定义函数

PostgreSQL 实现数组入参批量插入自定义函数

核心实现

不需要手动写循环逐行遍历数组,直接用PostgreSQL内置的unnest()函数把数组拆分为多行,配合INSERT ... SELECT语法完成批量插入,执行效率比显式循环高很多。
首先创建函数,注意把代码里的your_target_table替换为你实际的目标表名:

CREATE OR REPLACE FUNCTION insertdatausingarray(
    exp_ids integer[],
    group_id integer
)
RETURNS void 
LANGUAGE plpgsql VOLATILE
AS $$
BEGIN
    INSERT INTO your_target_table (group_id, exp_id)
    SELECT 
        insertdatausingarray.group_id,
        unnest(exp_ids) AS exp_id;
END;
$$;

正确调用方式

注意PostgreSQL的数组参数传参格式,你示例里的大括号写法需要显式声明数组类型,否则会抛出类型不匹配错误,两种合法调用方式如下:

-- 写法1:ARRAY构造器写法(推荐,不容易出类型问题)
SELECT insertdatausingarray(ARRAY[3275, 3845, 3578, 3125], 1000520);

-- 写法2:大括号字面量写法,需要强转为整数数组
SELECT insertdatausingarray('{3275, 3845, 3578, 3125}'::integer[], 1000520);

执行结果

调用完成后,目标表会插入4条符合预期的记录:

  • (3275, 1000520)
  • (3845, 1000520)
  • (3578, 1000520)
  • (3125, 1000520)

如果你后续需要在遍历每条exp_id时增加额外的自定义处理逻辑(比如字段校验、关联其他表计算字段值),可以改用显式FOREACH循环的写法,参考代码如下:

CREATE OR REPLACE FUNCTION insertdatausingarray(
    exp_ids integer[],
    group_id integer
)
RETURNS void 
LANGUAGE plpgsql VOLATILE
AS $$
DECLARE
    current_exp_id integer;
BEGIN
    FOREACH current_exp_id IN ARRAY exp_ids
    LOOP
        -- 此处可添加单条记录的自定义处理逻辑
        INSERT INTO your_target_table (group_id, exp_id)
        VALUES (group_id, current_exp_id);
    END LOOP;
END;
$$;

内容的提问来源于stack exchange,提问作者Sunil Kumar Patro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:54:40