這篇文章主要介紹了PostgreSQL存儲過(guò)程循環(huán)調用方式,存儲具有很好的過(guò)程參考價(jià)值,希望對大家有所幫助。循環(huán)一起跟隨(′▽?zhuān)?)小編過(guò)來(lái)看看吧
需求描述
碰到需求,調用需要往表里插入5萬(wàn)條數據, 打算使用存儲過(guò)程,但是postgres 數據庫沒(méi)有建存儲( ?ヮ?)過(guò)程的SQL, 所以使用函數來(lái)實(shí)現.
實(shí)現
create
or replace function creatData() returns boolean as $BODY$
decl( ???)are ii integer;
decl??are id1 integer;
declare id2 intege??r;
begin
ii = 1;
id1 = nextval('seq??_table');
id2 = nextval('seq_table');
FOR ii IN 1..50000 loop
insert
into
table1
values(
id??1,
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-0???7 13:55:08',
18051,
'2017-08-07 13:57:28',
false,
401,
10,
null,(╬?益?)
null,
null,
'D(′?ω?`)A-HZ001000003',
'2017-08-07 13:54:08'(?????),
'2017-08-??07 13:57:28',
10251
);
insert
into
t??able1
values(
id2,
10,
102(╬?益?)51,
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',
10(???)250
);
end LO??OP;
return true;
end;
$BODY$ LANGUAGE plpgsql;
問(wèn)題
這樣子插入只能插入一次, 因為取得序列值的地方在ヽ(′▽?zhuān)?ノ(zai)for循環(huán)的外面, id的值不會(huì )隨(′?_?`)著(zhù)循環(huán)再賦值, 主鍵沖突.
辦法
想到可以再對函數進(jìn)行循環(huán), 于是再寫(xiě)一個(gè)函數循環(huán)執行上一個(gè)函數, 去掉上個(gè)函數中的for 循環(huán)語(yǔ)句FOR i IN 1..500000?? loop='loop' 和 end loop='loop';
再寫(xiě)一個(gè)下面函數循環(huán)執行函數1
create or replace function loop="loop"C??reate()
returns vo??id as
$BODY$
begin for i in 1..50000 loop=""
PERFORM creatDa??ta();
end loop;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
執行函數
1select * from loop='loop'Create() as tab;
好了,完成,10萬(wàn)條數數據秒插, 2.1秒.
PS:CSDN的markdown??編(′▽?zhuān)?輯器真的很難用, 文字稍微長(cháng)一點(diǎn)就卡, 而且換行經(jīng)常自動(dòng)調跳回上一行, 無(wú)奈, 現在都是直接在別的地方寫(xiě)好粘貼回來(lái)&?hellip;
補充:postgresql 存儲過(guò)程中遍歷的一個(gè)小問(wèn)題
問(wèn)題
想實(shí)現這種功能,就是存儲 for r in 后面(mian)的sql語(yǔ)句是一個(gè)變量,要把以下代碼修改一下
"sqltext" = 'select "ID",過(guò)程"ZONENAME" from "ZONE_INFO" where "ID"<&(′ω`)gt;0';
for r in "sqltext"
loop='loop'
return next r;
end loop;
解決方法:
sqltext = 'select "ID","ZONENAME" from "ZONE_INFO" where "ID" <>0';
for r in execute sqltexヾ(′?`)?t
loop
return next r;
end loop="loop";
來(lái)源地址:https://www.jb51.net/article/204917.htm