Страница 1 из 1
Может кто-то знает почему savepoint не работает в FB 2.1
Добавлено: 13 мар 2008, 11:15
SpaceFlyer
Я раньпе работаал на 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.
Re: Может кто-то знает почему savepoint не работает в FB 2.1
Добавлено: 13 мар 2008, 11:18
hvlad
SpaceFlyer писал(а):Я раньпе работаал на IB 7.5, хочу перейти на FB 2.1 но не могу понять почему не работает SAVEPOINT. Вроде ещё в FB 1.5 было заявлено о том что оно работает...
Может что-то поменяли в синтаксисе?
Может что-то почитать в документации ?
Re: Может кто-то знает почему savepoint не работает в FB 2.1
Добавлено: 13 мар 2008, 11:41
stix-s
Может кто-то знает почему savepoint не работает в FB 2.1
Добавлено: 13 мар 2008, 11:56
SpaceFlyer
Я прочёл, доку
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
Может кто-то знает почему savepoint не работает в FB 2.1
Добавлено: 13 мар 2008, 12:24
SpaceFlyer
Проверил сам всё работает по следуещему алгоритму
procedure test
as
begin
EXECUTE PROCEDURE P2;
BEGIN
EXECUTE PROCEDURE P1;
WHEN ANY DO
A=1;
END
end
если в процедуре P1 появился exception, то
всё изменения выполненые в процедуре P1 откатываются,
а изменения в P1 сохраняются.
Добавлено: 13 мар 2008, 15:36
hvlad
Недочитал или недопонял. BEGIN\END и есть сэйвпойнт
Добавлено: 13 мар 2008, 16:10
kdv
если в процедуре P1 появился exception, то
всё изменения выполненые в процедуре P1 откатываются,
а изменения в P1 сохраняются.
а нафига ты там пишешь when any, т.е. таким образом "гасишь" exception???
если тебе надо чтобы все откатывалось само-собой, то не пиши ничего лишнего. ни when, ни savepoint.
Вот, блин, тоже, любители экзотики
