用现有值初始化生成器
Initialize generator with existing value
我正在尝试设置一个值在 table 中的生成器,我已经看过这个问题 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 ;#
如果你想使用 "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
您的代码的问题在于您无法单独执行 gen_id
;解析器期望 gen_id
(或更准确地说:函数调用)仅在您可以拥有值的地方(例如在语句或赋值中)。您需要将其 return 值分配给一个参数,例如:
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 ;#
请注意,像这样更改序列是 'risky':如果有任何使用相同序列的交错操作,您实际上可能不会得到预期的结果(序列可能以不同的值结束)比 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 ;#
在一条语句中执行此操作将降低交错操作的风险(尽管它不会完全消除它)。
我正在尝试设置一个值在 table 中的生成器,我已经看过这个问题 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 ;#
如果你想使用 "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
您的代码的问题在于您无法单独执行 gen_id
;解析器期望 gen_id
(或更准确地说:函数调用)仅在您可以拥有值的地方(例如在语句或赋值中)。您需要将其 return 值分配给一个参数,例如:
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 ;#
请注意,像这样更改序列是 'risky':如果有任何使用相同序列的交错操作,您实际上可能不会得到预期的结果(序列可能以不同的值结束)比 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 ;#
在一条语句中执行此操作将降低交错操作的风险(尽管它不会完全消除它)。