Проблема с вашим кодом в том, что вы не можете выполнить gen_id
изолированно; синтаксический анализатор ожидает gen_id
(или, точнее: вызов функции) только в том месте, где вы можете иметь значение (например, в операторе или присваивании). Вам нужно присвоить возвращаемое значение параметру, например:
set term #;
execute block
as
declare i int = 0;
declare temp int = 0;
begin
i = (select max(id) from items);
temp = gen_id(GEN_ITEMS_ID, -(gen_id(GEN_ITEMS_ID, 0))); ---set some_gen to 0
temp = gen_id(GEN_ITEMS_ID, :i); --- set to i
end #
set term ;#
Имейте в виду, что изменение таких последовательностей является «рискованным»: если есть какие-либо чередующиеся действия, использующие одну и ту же последовательность, вы можете не получить ожидаемый результат (последовательность может оказаться со значением, отличным от i
, и вы можете получить дубликат ключевые ошибки, когда другая транзакция использует последовательность после вычитания текущего значения (установленного в 0
) и перед добавлением i
.
Как также отмечено в комментариях, вы также можете заменить свой код на:
set term #;
execute block
as
declare i int = 0;
declare temp int = 0;
begin
i = (select max(id) from items);
temp = gen_id(GEN_ITEMS_ID, :i - gen_id(GEN_ITEMS_ID, 0));
end #
set term ;#
Выполнение этого в одном операторе уменьшит риск чередования операций (хотя и не устранит его полностью).
person
Mark Rotteveel
schedule
21.07.2016