PostgreSQL存储过程循环调用方式
需求描述
碰到需求,需要往表里插入5万条数据,打算使用存储过程,但是postgres数据库没有建存储过程的SQL,所以使用函数来实现.
表数据结构完整性要求一次插入两条记录,两条记录相互外键约束,record1的partner_id字段值是record2的主键id的值,record2的partner_id字段值是record1的主键id的值.
实现
create
orreplacefunctioncreatData()returnsbooleanas$BODY$
declareiiinteger;
declareid1integer;
declareid2integer;
begin
ii=1;
id1=nextval('seq_table');
id2=nextval('seq_table');
FORiiIN1..50000LOOP
insert
into
table1
values(
id1,
10,
10250,
5001,
'2017-08-0714:00:00',
'2017-08-0715:00:00',
id2,
true,
864,
16950,
0,
0,
0,
null,
20,
null,
18050,
'2017-08-0713:55:08',
18051,
'2017-08-0713:57:28',
false,
401,
10,
null,
null,
null,
'DA-HZ001000003',
'2017-08-0713:54:08',
'2017-08-0713:57:28',
10251
);
insert
into
table1
values(
id2,
10,
10251,
5001,
'2017-08-0714:00:00',
'2017-08-0715:00:00',
id1,
true,
864,
16950,
0,
0,
0,
null,
20,
null,
18050,
'2017-08-0713:55:08',
18051,
'2017-08-0713:57:28',
false,
401,
10,
null,
null,
null,
'DA-HZ001000003',
'2017-08-0713:54:08',
'2017-08-0713:57:28',
10250
);
endLOOP;
returntrue;
end;
$BODY$LANGUAGEplpgsql;
问题
这样子插入只能插入一次,因为取得序列值的地方在for循环的外面,id的值不会随着循环再赋值,主键冲突.
办法
想到可以再对函数进行循环,于是再写一个函数循环执行上一个函数,去掉上个函数中的for循环语句FORiIN1..500000LOOP和endLOOP;
再写一个下面函数循环执行函数1
createorreplacefunctionloopCreate() returnsvoidas $BODY$ beginforiin1..50000LOOP PERFORMcreatData(); endLOOP; end; $BODY$ LANGUAGE'plpgsql'VOLATILE;
执行函数
select*fromloopCreate()astab;
好了,完成,10万条数数据秒插,2.1秒.
PS:CSDN的markdown编辑器真的很难用,文字稍微长一点就卡,而且换行经常自动调跳回上一行,无奈,现在都是直接在别的地方写好粘贴回来…
补充:postgresql存储过程中遍历的一个小问题
问题
想实现这种功能,就是forrin后面的sql语句是一个变量,要把以下代码修改一下
"sqltext"='select"ID","ZONENAME"from"ZONE_INFO"where"ID"<>0'; forrin"sqltext" loop returnnextr; endloop;
解决方法:
sqltext='select"ID","ZONENAME"from"ZONE_INFO"where"ID"<>0'; forrinexecutesqltext loop returnnextr; endloop;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。