Wow. Thank you! Sorry, i should read the documentation more carefully
03.08.2016, 16:04, "Pavel Stehule" <pavel.stehule@gmail.com>:
> 2016-08-03 11:53 GMT+02:00 <klimych@tut.by>:
>> The following bug has been logged on the website:
>>
>> Bug reference:Â Â Â 14275
>> Logged by:Â Â Â Â Â Oleg Klimovich
>> Email address:Â Â Â klimych@tut.by
>> PostgreSQL version: 9.5.3
>> Operating system:Â Â Windows 7, Windows 8, Ubuntu 14.04
>> Description:
>>
>> DO $$
>> DECLARE
>> Â cur cursor for select 1; -- (1)
>> BEGIN
>> Â open cur; -- (2)
>>
>> Â DECLARE
>> Â Â cur cursor for select 2; -- (3)
>> Â BEGIN
>> Â Â open cur; -- (4)
>> Â Â close cur; -- (5)
>> Â END;
>>
>> Â close cur; -- (6)
>> end $$;
>>
>> Executing of the code gives error "cursor "cur" already in use". Evedently,
>> PG in statement (4) refers to the variable, defined in statement (1). (and I
>> expect it should be variable, defined in statement (3)).
>> Futhermore, same error exists even across different functions:
>>
>> create function func1() returns void as $$
>> declare
>> Â cur cursor for select 1;
>> BEGIN
>> Â open cur;
>> Â close cur;
>> end
>> $$
>> Â LANGUAGE 'plpgsql';
>>
>> create function func2() returns void as $$
>> declare
>> Â cur cursor for select 1;
>> BEGIN
>> Â open cur;
>>
>> Â PERFORM func1();
>>
>> Â close cur;
>> end
>> $$
>> Â LANGUAGE 'plpgsql';
>>
>> select func2();
>>
>> So, cursor's variable is kind of global. I just hope it's a bug and not
>> "feature" (at least I haven't found mention of such behaviour in
>> documentation)
>
> It is feature - PLpgSQL engine uses named cursor accessed via SPI API. The name of SPI cursor is generated by cursor
variablename. SPI API has zero relation to plpgsql block structure.
>
> See source code pl_exec.c exec_stmt_open
>
> Regards
>
> Pavel
>
>> --
>> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-bugs