Может кто-то знает почему savepoint не работает в FB 2.1

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
SpaceFlyer
Сообщения: 3
Зарегистрирован: 13 мар 2008, 11:07

Может кто-то знает почему savepoint не работает в FB 2.1

Сообщение SpaceFlyer » 13 мар 2008, 11:15

Я раньпе работаал на IB 7.5, хочу перейти на FB 2.1 но не могу понять почему не работает SAVEPOINT. Вроде ещё в FB 1.5 было заявлено о том что оно работает...
Может что-то поменяли в синтаксисе?

Создание простой процедуры типа

[code]CREATE PROCEDURE TEST1(
LINENUM INTEGER
)
AS
BEGIN
SAVEPOINT A1;
INSERT INTO MAINCONST(ORGCODE) VALUES (1);
RALLBACK TO A1;
EXIT;
END
;[/code]
Выдаёт сообщение

Invalid token.Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, column 3.
SAVEPOINT.
Transaction rolled back.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Может кто-то знает почему savepoint не работает в FB 2.1

Сообщение hvlad » 13 мар 2008, 11:18

SpaceFlyer писал(а):Я раньпе работаал на IB 7.5, хочу перейти на FB 2.1 но не могу понять почему не работает SAVEPOINT. Вроде ещё в FB 1.5 было заявлено о том что оно работает...
Может что-то поменяли в синтаксисе?
Может что-то почитать в документации ?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Может кто-то знает почему savepoint не работает в FB 2.1

Сообщение stix-s » 13 мар 2008, 11:41

RALLBACK TO A1;
?

SpaceFlyer
Сообщения: 3
Зарегистрирован: 13 мар 2008, 11:07

Может кто-то знает почему savepoint не работает в FB 2.1

Сообщение SpaceFlyer » 13 мар 2008, 11:56

Я прочёл, доку

2. User savepoints are not supported in PSQL. Use traditional PSQL
exception handling to undo changes performed in stored procedures
and triggers. Support of user savepoints in PSQL layer would break
the concept of statement atomicity (including procedure call statements).
Each SQL/PSQL statement is executed under automatic system savepoint
and either complete successfully or ALL its changes are rolled
back and exception is raised. Each PSQL exception handling block is
also bounded by automatic system savepoints.

Из выше сказаного могу ли я сделать вывод, что если я вызову процедуру
как показано ниже, то я могу быть уверен, что все изменения сделаные в процедуре P1 будут откачены назад, в случае ошибки.

BEGIN
EXECUTE PROCEDURE P1;
WHEN ANY DO
A=1;
END
END

SpaceFlyer
Сообщения: 3
Зарегистрирован: 13 мар 2008, 11:07

Может кто-то знает почему savepoint не работает в FB 2.1

Сообщение SpaceFlyer » 13 мар 2008, 12:24

Проверил сам всё работает по следуещему алгоритму

procedure test
as
begin
EXECUTE PROCEDURE P2;
BEGIN
EXECUTE PROCEDURE P1;
WHEN ANY DO
A=1;
END
end

если в процедуре P1 появился exception, то
всё изменения выполненые в процедуре P1 откатываются,
а изменения в P1 сохраняются.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 13 мар 2008, 15:36

Недочитал или недопонял. BEGIN\END и есть сэйвпойнт

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 мар 2008, 16:10

если в процедуре P1 появился exception, то
всё изменения выполненые в процедуре P1 откатываются,
а изменения в P1 сохраняются.
а нафига ты там пишешь when any, т.е. таким образом "гасишь" exception???

если тебе надо чтобы все откатывалось само-собой, то не пиши ничего лишнего. ни when, ни savepoint.
Вот, блин, тоже, любители экзотики :)

Ответить