代码之家  ›  专栏  ›  技术社区  ›  Alec

使用现有值初始化生成器

  •  1
  • Alec  · 技术社区  · 8 年前

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

    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 ;#
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark Rotteveel    8 年前

    代码的问题是无法执行 gen_id 隔离;解析器需要 发电机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 )在你添加之前 .

    如注释中所述,您还可以将代码替换为:

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

    在一条语句中执行该操作将降低交叉操作的风险(尽管它不会完全删除)。

        2
  •  2
  •   Val Marinov    8 年前

    如果您想使用“execute block”,您可以使用类似这样的代码:

    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