Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireBird 3. Неожиданное поведение курсора в хранимой процедуре. / 2 сообщений из 2, страница 1 из 1
28.03.2017, 08:47
    #39428169
Makarenko Sasha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
Всем доброго дня! При переходе на 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
28.03.2017, 09:13
    #39428179
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireBird 3. Неожиданное поведение курсора в хранимой процедуре.
Makarenko Sasha,

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


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