powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновление записи по курсору
7 сообщений из 7, страница 1 из 1
Обновление записи по курсору
    #39886948
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на такое поведение Interbase.

Есть таблица с тремя полями
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE TEST (
    ID     INTEGER NOT NULL,
    DATA1  INTEGER,
    DATA2  INTEGER
);



В таблице есть запись
Код: sql
1.
INSERT INTO test ("ID") VALUES (1);



И есть такая процедура
Код: sql
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.
CREATE PROCEDURE SP_TEST
AS
  DECLARE VARIABLE var_id INTEGER;
BEGIN
  FOR
    SELECT
      t."ID"
    FROM
      test t
    WHERE
      t."ID" = 1
    INTO
      :var_id
    AS CURSOR
      cur_tst
  DO BEGIN
    UPDATE test t SET
      t."DATA1" = 1
    WHERE
      t."ID" = :var_id;

    UPDATE test t SET
      t."DATA2" = 2
    WHERE
      CURRENT OF cur_tst;
  END
END

Т.е. вначале обновляется одно поле на основании ID, а затем другое поле на основании текущего курсора.

После выполнения процедуры получаю таблицу
IDDATA1DATA21NULL2
Как я понимаю, причина в том, что второй UPDATE или проигнорировал результаты первого UPDATE или обновил все поля на основании текущего курсора, несмотря на то, что было указано обновить только одно поле.

Если заменить последний UPDATE на такой
Код: sql
1.
2.
3.
4.
    UPDATE test t SET
      t."DATA2" = 2
    WHERE
      t."ID" = :var_id;

то получаем адекватную картину
IDDATA1DATA2112
Собственно вопрос, это баг Interbase или это адекватное поведение курсора?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39886953
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем если добавить такой логгирующий триггер
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TRIGGER TR_TEST_BU0 FOR TEST
ACTIVE BEFORE UPDATE POSITION 0
AS
  DECLARE VARIABLE var_msg VARCHAR(256);
BEGIN
  var_msg =
    'Old.Data1: ' || COALESCE(OLD."DATA1", -1) ||
    ', New.Data1: ' || COALESCE(NEW."DATA1", -1) ||
    ', Old.Data2: ' || COALESCE(OLD."DATA2", -1) ||
    ', New.Data2: ' || COALESCE(NEW."DATA2", -1);
  INSERT INTO log (
    "MSG"
  ) VALUES (
    :var_msg
  );
END

То получается такая картина
IDMSG3Old.Data1: -1, New.Data1: 1, Old.Data2: -1, New.Data2: -14Old.Data1: -1, New.Data1: -1, Old.Data2: -1, New.Data2: 2Т.е. при втором UPDATE обновляется старая версия записи
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39886963
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

про это надо в техсаппорте ИБ спрашивать.
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39886979
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
_Vasilisk_,

про это надо в техсаппорте ИБ спрашивать.


Зевая: и версию назвать когда спрашиваешь...
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39886988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_это баг Interbase или это адекватное поведение курсора?

select for update изменит картину?

А так-то это, конечно, баг, причём, возможно, из старых, правившихся ещё в FB 1.0-1.5.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39887608
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
select for update изменит картину?
Нет
Dimitry Sibiryakov
А так-то это, конечно, баг,
Спасибо. Думал, что я чего-то не понимаю в версионности записей
Старый плюшевый мишка
и версию назвать когда спрашиваешь...
А смысл? Меня интересует только это нормальное поведение или нет.
...
Рейтинг: 0 / 0
Обновление записи по курсору
    #39887610
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
11.11.2019 17:16, _Vasilisk_ пишет:
>
> А смысл? Меня интересует только это нормальное поведение или нет.

проверь на FB и сделай выводы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновление записи по курсору
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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