Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SAVEPOINT, EXECUTE BLOCK, EXCEPTION / 6 сообщений из 6, страница 1 из 1
27.10.2016, 15:28
    #39335496
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
Шалом.

В 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
27.10.2016, 15:29
    #39335499
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
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
27.10.2016, 15:31
    #39335502
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SAVEPOINT, EXECUTE BLOCK, EXCEPTION
pastor,

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

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

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

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

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

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

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


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