powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SAVEPOINT, EXECUTE BLOCK, EXCEPTION
6 сообщений из 6, страница 1 из 1
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335496
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шалом.

В N-ном звене динамически формируется EB (один оператор!), из которого фетчятся данные.
Результат выполнения коммитится всегда, независимо от того, вывалит или нет исключение.
Текст исключения динамический.

Вопрос: как откатить часть операций (после фетча!) из EB?


Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
execute block
returns (
PROGRESS varchar(100)
)
as
begin
 -- >>>>
 -- блок операций, которые выполняются всегда
 delete from T_TEST;
 PROGRESS = 'START';  suspend;

 in autonomous transaction do --если сработает savepoint, то можно не в автономе
 insert into T_TEST( OPER) values (:PROGRESS || CURRENT_TIMESTAMP);

 -- <<<<

 -- опциональный блок
 -- savepoint p1;
 -- хочу откатить сюда

 PROGRESS = 'P_TEST1'; suspend;
 for select RESULT
     from P_TEST1
     into :PROGRESS
     do suspend;

 PROGRESS = 'P_TEST2'; suspend;
 for select RESULT
     from P_TEST2
     into :PROGRESS
     do suspend;

 PROGRESS = 'PROCESSED'; suspend;
 for select OPER
     from T_TEST
     into :PROGRESS
     do suspend;

 when any
 do begin
     -- rollback p1;
     exception;
    end
end


...
Рейтинг: 0 / 0
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335499
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

метаданные для создания

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
set term ^ ;

create exception E_TEST 'e-xception'^


create table T_TEST (
OPER varchar(100)
)
^

create or alter procedure P_TEST1
returns (
RESULT integer
) as
begin
 RESULT = 0;
 while (RESULT < 10)
  do begin
      RESULT = RESULT + 1;
      insert into T_TEST( OPER) values ('P_TEST1:'|| :RESULT);
      suspend;
     end
end
^

create or alter procedure P_TEST2
returns (
RESULT integer
) as
begin
 RESULT = 0;
 while (RESULT < 10)
  do begin
      RESULT = RESULT + 1;
      insert into T_TEST( OPER) values ('P_TEST2:'|| :RESULT);
      if (RESULT =  2)
         then exception E_TEST 'error on ' || RESULT;
      suspend;
     end
end
^

...
Рейтинг: 0 / 0
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335502
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

никак
...
Рейтинг: 0 / 0
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335525
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

кошка! (с)
...
Рейтинг: 0 / 0
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335532
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

я уже не один раз предупреждал про селективные процедуры с модификацией данных, вот ты и вляпался. Природу этого явления до конца объяснить не готов. Что-то связанное с особенностью работы suspend.
...
Рейтинг: 0 / 0
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
    #39335552
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисpastor,

я уже не один раз предупреждал про селективные процедуры с модификацией данных, вот ты и вляпался. Природу этого явления до конца объяснить не готов. Что-то связанное с особенностью работы suspend.

про этот ньюанс я уже лет двадцать как в курсе.

была жалкая надежда на savepoint.

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


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