用现有值初始化生成器

费罗

我正在尝试使用某个表中的值设置生成器,我已经看到了这个问题如何设置初始生成器值?并按照他们的建议做了,但我不知道我在哪里错了。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章