使用现有值初始化生成器



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

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 ;#

在一个语句中执行它将降低交错操作的风险(尽管它不会完全消除它)。

如果你想使用"执行块",你可以使用类似的东西:

execute block    
as  
declare i int = 0;    
begin  
  i = (select max(some_col) from some_table);
  execute statement ('set generator MY_GENERATOR to ' || :i);
end

相关内容

  • 没有找到相关文章

最新更新