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;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。