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()
を入力し、結果表があるとき:
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
それから私は、正しい結果を得る:
をしかし、私はまだ疑問に思います最初の関数で2行しか挿入されないのはなぜですか?
なぜ、(遅く非効率的な)カーソルを最初に使用していますか?これを行うには、「都市に挿入する(pop)都市から選択するpop + 2を選択する」という文を使用して、** more **をより効率的に行うことができます。 –
あなたのループには2つのフェッチがあります:最初に暗黙のうちに 'for LOOP'行に、' fetch cur into b; 'に2番目の明示的なフェッチがあります。したがって、各反復で実際に2回のフェッチを実行しています。 – Abelisto