提问人:rvpals 提问时间:8/31/2023 更新时间:8/31/2023 访问量:63
通过从表中查找值来按顺序重置Last_NUMBER
Resetting the Last_NUMBER in sequence by looking up a value from a table
问:
我有一个叫做 SEQ_SYNTAX 的序列。我需要通过从另一个名为 INCREMENTS 的表中查找值来设置此序列的last_number值。我可以通过执行 SELECT LASTVAL FROM INCREMENTS WHERE TABLE = 'SYNTAX';
如何编写可以设置该序列值的简单 SQL 脚本?假设如果 increments 表中的 lastval 其中 table = 'SYNTAX' 是 3000,我想将序列SEQ_SYNTAX的last_number设置为 3000。
谢谢。
答:
1赞
Paul W
8/31/2023
#1
从 12c 开始,您只需重置起始值即可。以编程方式执行此操作将需要 PL/SQL,因此我们必须使用 因为 是 DDL:EXECUTE IMMEDIATE
ALTER SEQUENCE
DECLARE
var_sequence_name varchar2(128) := 'SEQ_SYNTAX';
var_new_value integer;
BEGIN
SELECT MAX(lastval)
INTO var_new_value
FROM increments
WHERE "TABLE" = 'SYNTAX';
IF var_new_value > 0
THEN
EXECUTE IMMEDIATE 'alter sequence "'||var_sequence_name||'" restart start with '||v_new_value;
END IF;
END;
如果您是 12c 之前的值,如果新值低于当前值,则必须删除并重新创建序列,或者如果新值较大,则使用脚本进行虚拟推进,直到达到新值。这很麻烦,所以我们很感激 12c 的增强。
评论
0赞
rvpals
8/31/2023
我们在 Oracle 19 上
0赞
rvpals
8/31/2023
我不熟悉 Oracle PL/SQL 编写此脚本的方式。请帮忙。
0赞
Paul W
8/31/2023
@rvpals,根据您的详细信息,用更完整的脚本编辑了我的答案
0赞
rvpals
8/31/2023
如何将其转换为可以从 My Oracle SQL 脚本中重复调用的函数。我想传入序列名称和第二个参数作为表的名称。我希望能够调用 function(SEQ1, 'SYNTAX');调用函数(SEQ2, 'NUMBER');该函数会将第二个参数放入 “TABLE” = 'NUMBER' 中,并更新特定的序列名称(在第一个参数中传递)
0赞
Paul W
9/1/2023
将查询中的 替换为 和 也更改为 。DECLARE
CREATE OR REPLACE PROCEDURE p_reset_sequence(var_sequence_name IN varchar2, var_table_name IN varchar2) AS
"TABLE"
var_table_name
评论