今天就跟大家聊聊有关如何在PostgreSQL中循环调用存储过程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
create
or replace function creatData() returns boolean as $BODY$
declare ii integer;
declare id1 integer;
declare id2 integer;
begin
ii = 1;
id1 = nextval('seq_table');
id2 = nextval('seq_table');
FOR ii IN 1..50000 LOOP
insert
into
table1
values(
id1,
10,
10250,
5001,
'2017-08-07 14:00:00',
'2017-08-07 15:00:00',
id2,
true,
864,
16950,
0,
0,
0,
null,
20,
null,
18050,
'2017-08-07 13:55:08',
18051,
'2017-08-07 13:57:28',
false,
401,
10,
null,
null,
null,
'DA-HZ001000003',
'2017-08-07 13:54:08',
'2017-08-07 13:57:28',
10251
);
insert
into
table1
values(
id2,
10,
10251,
5001,
'2017-08-07 14:00:00',
'2017-08-07 15:00:00',
id1,
true,
864,
16950,
0,
0,
0,
null,
20,
null,
18050,
'2017-08-07 13:55:08',
18051,
'2017-08-07 13:57:28',
false,
401,
10,
null,
null,
null,
'DA-HZ001000003',
'2017-08-07 13:54:08',
'2017-08-07 13:57:28',
10250
);
end LOOP;
return true;
end;
$BODY$ LANGUAGE plpgsql;
这样子插入只能插入一次, 因为取得序列值的地方在for循环的外面, id的值不会随着循环再赋值, 主键冲突.
想到可以再对函数进行循环, 于是再写一个函数循环执行上一个函数, 去掉上个函数中的for 循环语句FOR i IN 1..500000 LOOP 和 end LOOP;
再写一个下面函数循环执行函数1
create or replace function loopCreate()
returns void as
$BODY$
begin for i in 1..50000 LOOP
PERFORM creatData();
end LOOP;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
执行函数
select * from loopCreate() as tab;
好了,完成,10万条数数据秒插, 2.1秒.
PS:CSDN的markdown编辑器真的很难用, 文字稍微长一点就卡, 而且换行经常自动调跳回上一行, 无奈, 现在都是直接在别的地方写好粘贴回来…
补充:postgresql 存储过程中遍历的一个小问题
想实现这种功能,就是 for r in 后面的sql语句是一个变量,要把以下代码修改一下
"sqltext" = 'select "ID","ZONENAME" from "ZONE_INFO" where "ID"<>0';
for r in "sqltext"
loop
return next r;
end loop;
sqltext = 'select "ID","ZONENAME" from "ZONE_INFO" where "ID" <>0';
for r in execute sqltext
loop
return next r;
end loop;
看完上述内容,你们对如何在PostgreSQL中循环调用存储过程有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。