关于Pl / pgsql中游标的一些错误

时间:2016-05-03 14:27:34

标签: postgresql cursor plpgsql

我知道从表中插入值的正确方法:
insert into city (pop) select pop+2 from city
 我只是想知道游标在Pl / pgsql中是如何工作的。

我希望在循环中使用cursor来插入一些值:

create or replace function test(  ) returns void as 
$$
declare
cur cursor for select pop+2 from city order by pop;
b int;
row record;
begin
for row in cur
LOOP 
fetch cur into b;
insert into city(pop) select b;
end loop;
end;
$$ language plpgsql    

但是,当我输入select test()并且结果表为:

enter image description here

很奇怪,只插入了两行。所以我想知道导致这个结果的原因是什么?

在04/05/2016更新我的问题:
我修改了这个函数:

create or replace function test(  ) returns void as 
$$
declare
cur cursor for select * from city order by pop;
b record;
begin
for b in cur
LOOP 
insert into city(pop) select b.pop+2;
RAISE NOTICE ' % IS INSERTED' , b;
end loop;
end;
$$ language plpgsql

然后我得到了正确的结果:
enter image description here

但我仍然想知道为什么在第一个函数中,只插入了两行。

1 个答案:

答案 0 :(得分:1)

我终于弄明白为什么结果是错误的,就像 Abelisto的评论一样。我在每个步骤loop做了两个取件器:

  1. at for row in cur LOOP
  2. at fetch cur into b
  3. 第一行where pop=500和第pop =1000for loop中已经提取bString[] words = str.split("(?<=\\G...)"); 无法获取。{ / p>