我正在尝试使用某个表中的值设置生成器,我已经看到了这个问题如何设置初始生成器值?并按照他们的建议做了,但我不知道我在哪里错了。
set term #
execute block
as
declare i int = 0;
begin
i = (select max(some_col) from Table);
gen_id(some_gen,-(gen_id(some_gen,0))); ---set some_gen to 0
gen_id(some_gen,:i); --- set to i
end #
set term ;#
代码的问题在于您不能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 ;#
一言一行地执行此操作将减少交错操作的风险(尽管不会完全删除它)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句