ページの先頭行へ戻る
Enterprise Postgres 17 リリース情報

2.2.50 PL/pgSQLでのバウンドカーソル変数へのポータル名の割り当てルールの変更

非互換

PL/pgSQLでのバウンドカーソル変数へのポータル名の割り当てルールを変更します。

Fujitsu Enterprise Postgres 15以前の場合

バウンドカーソル変数のポータル名は、変数名と一致するように割り当てられていました。

postgres=# create or replace function forc01() returns void as $$
postgres$# declare
postgres$#   c cursor(r1 integer, r2 integer)
postgres$#        for select * from generate_series(r1,r2) i;
postgres$# begin
postgres$#   for r in c(5,7) loop
postgres$#     raise notice '% from %', r.i, c;
postgres$#   end loop;
postgres$#   return;
postgres$# end;
postgres$# $$ language plpgsql;
CREATE FUNCTION
postgres=# select forc01();
NOTICE:  5 from c
NOTICE:  6 from c
NOTICE:  7 from c
 forc01
--------
(1 行)
Fujitsu Enterprise Postgres 16の場合

バウンドカーソル変数のポータル名は、変数名と一致しなくなります。

postgres=# create or replace function forc01() returns void as $$
postgres$# declare
postgres$#   c cursor(r1 integer, r2 integer)
postgres$#        for select * from generate_series(r1,r2) i;
postgres$# begin
postgres$#   for r in c(5,7) loop
postgres$#     raise notice '% from %', r.i, c;
postgres$#   end loop;
postgres$#   return;
postgres$# end;
postgres$# $$ language plpgsql;
CREATE FUNCTION
postgres=# select forc01();
NOTICE:  5 from <unnamed portal 1>
NOTICE:  6 from <unnamed portal 1>
NOTICE:  7 from <unnamed portal 1>
 forc01
--------
(1 行)

対処方法

以前の動作に戻すためには、カーソル変数に明示的にポータル名を割り当ててください。

上記の例の場合、下記の行をbeginの後に追加することで、以前と同じ動作にできます。

c: = ‘c’;