2016-05-03 6 views
0

でカーソルに関するいくつかのエラー私はテーブルから値を挿入するための正しい方法を知っている:
insert into city (pop) select pop+2 from city
私はちょうどカーソルは、PL/pgSQLでどのように動作するかを知りたいです。
にPL/pgSQL

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

2行のみということは非常に奇妙だ、私はいくつかの値を挿入するループ内でカーソルを使用したい
挿入されます。だから私はこの結果の原因を知りたいのですが?私はこのような機能を改正

は、2016年4月5日で私の質問を更新し

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

をしかし、私はまだ疑問に思います最初の関数で2行しか挿入されないのはなぜですか?

+0

なぜ、(遅く非効率的な)カーソルを最初に使用していますか?これを行うには、「都市に挿入する(pop)都市から選択するpop + 2を選択する」という文を使用して、** more **をより効率的に行うことができます。 –

+1

あなたのループには2つのフェッチがあります:最初に暗黙のうちに 'for LOOP'行に、' fetch cur into b; 'に2番目の明示的なフェッチがあります。したがって、各反復で実際に2回のフェッチを実行しています。 – Abelisto

答えて

1

私は最終的に、なぜ結果がちょうどAbelistoさんのコメントのように、間違っていることを把握。私は、各ステップでloop二つフェッチャをした:だからfetch cur into b

for row in cur LOOP

  1. 最初の行where pop=500pop =1000既にfor loopにフェッチされた第三の行、およびそれbで取得できません。

関連する問題