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
相关产品推荐
相关产品推荐

