powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
2 сообщений из 2, страница 1 из 1
FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
    #39428169
Makarenko Sasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня! При переходе на FB3 обнаружил следующее:
Использую курсор в процедуре. Курсор из временной таблицы.
Временная таблица изменяется и наполняется в процедуре, потом
открывается курсор и производятся некоторые действия. Так вот в
FB3 в курсор не попадают только что добавленные записи во временную таблицу.

первая процедура выбирает данные из временной таблицы в курсор и в цикле делаю suspend;
затем из той же таблицы выбираю данные с помощью for select;

во второй процедуре меняю порядок вывода/l

ожидаю:
TYPE_S FIELD_1
cursort 1
cursort 2
cursort 3
cursort 4
for select 1
for select 2
for select 3
for select 4

получаю:
TYPE_S FIELD_1
for select 1
for select 2
for select 3
for select 4

Но если сделать for select первым, то все работает как ожидается...

TYPE_S FIELD_1
for select 1
for select 2
for select 3
for select 4
cursor 1
cursor 2
cursor 3
cursor 4

Процедуры в тестовой базе выдают разный результат в FB3.02
В FB2.5 процедуры ведут себя идентично.
скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
/******************************************************************************/
/***         Generated by IBExpert 2017.2.28.1 28.03.2017 10:10:37          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;

SET CLIENTLIB 'fbclient.dll';

CREATE DATABASE 'localhost:cursor_test'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;



/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

CREATE PROCEDURE TEST_CURSOR_TMP
RETURNS (
    TYPE_S VARCHAR(10),
    FIELD_1 INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TEST_CURSOR_TMP_2
RETURNS (
    TYPE_S VARCHAR(10),
    FIELD_1 INTEGER)
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE GLOBAL TEMPORARY TABLE TEMP_TABLE (
    FIELD_1  INTEGER
) ON COMMIT DELETE ROWS;




/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

ALTER PROCEDURE TEST_CURSOR_TMP
RETURNS (
    TYPE_S VARCHAR(10),
    FIELD_1 INTEGER)
AS
declare C cursor for (
    select FIELD_1
    from TEMP_TABLE);
begin
  insert into TEMP_TABLE (FIELD_1) values (1);
  insert into TEMP_TABLE (FIELD_1) values (2);
  insert into TEMP_TABLE (FIELD_1) values (3);
  insert into TEMP_TABLE (FIELD_1) values (4);

  type_s = 'cursor';
  open c;
  while (1 = 1) do
  begin
    fetch c into :field_1;
    if (row_count = 0) then
      leave;
    suspend;
  end
  close c;


  for select 'for select', field_1
      from temp_table
      into :type_s, :field_1
  do suspend;

end^


ALTER PROCEDURE TEST_CURSOR_TMP_2
RETURNS (
    TYPE_S VARCHAR(10),
    FIELD_1 INTEGER)
AS
declare C cursor for (
    select FIELD_1
    from TEMP_TABLE);
begin
  insert into TEMP_TABLE (FIELD_1) values (1);
  insert into TEMP_TABLE (FIELD_1) values (2);
  insert into TEMP_TABLE (FIELD_1) values (3);
  insert into TEMP_TABLE (FIELD_1) values (4);

  for select 'for select', field_1
      from temp_table
      into :type_s, :field_1
  do suspend;

  type_s = 'cursor';
  open c;
  while (1 = 1) do
  begin
    fetch c into :field_1;
    if (row_count = 0) then
      leave;
    suspend;
  end
  close c;

end^



SET TERM ; ^

...
Рейтинг: 0 / 0
FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
    #39428179
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makarenko Sasha,

похоже на регрессию. В трекер
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]