【发布时间】:2021-09-30 17:01:04
【问题描述】:
我的表的列(不是主键)有一个序列,每次插入都会递增。
我希望新年的每一天都将该序列重置为值 1。
我已经看到了一些删除和重新创建序列的解决方案。但我想每年安排一次。
这怎么可能?
提前致谢
【问题讨论】:
-
您为什么不简单地在 crontab 中安排一次(假设您使用的是 unix),它会启动一个小 sql 脚本来重新创建您的序列?或者更简单:使用 DBMS_SCHEDULER
我的表的列(不是主键)有一个序列,每次插入都会递增。
我希望新年的每一天都将该序列重置为值 1。
我已经看到了一些删除和重新创建序列的解决方案。但我想每年安排一次。
这怎么可能?
提前致谢
【问题讨论】:
您可以使用DBMS_SCHEDULER Oracle 包来安排作业。在此处查看更多详细信息:https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse.htm
创建一个重置序列的过程,并将该过程作为每年的计划作业运行。以下是此类过程的示例:How do I reset a sequence in Oracle?
【讨论】:
试试我自己的程序
create or replace procedure reset_seq_hh_ww(p_seq_name in varchar2,
num_seq in Number) is
l_val number;
curr_se number;
min_l_val number;
begin
execute immediate 'select ' || p_seq_name || '.nextval from dual'
INTO l_val;
DBMS_OUTPUT.PUT_LINE('1-l_val='||l_val);
if l_val > num_seq then
min_l_val := -1 * l_val;
execute immediate
'alter sequence ' || p_seq_name || ' increment by ' || min_l_val || ' minvalue 0';
DBMS_OUTPUT.PUT_LINE('alter sequence ' || p_seq_name || ' increment by ' || min_l_val || ' minvalue 0');
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_val;
DBMS_OUTPUT.PUT_LINE('select ' || p_seq_name || '.nextval from dual');
DBMS_OUTPUT.PUT_LINE('2-min_l_val='||min_l_val);
DBMS_OUTPUT.PUT_LINE('3-l_val='||l_val);
curr_se := num_seq-1;
if curr_se=0 then curr_se:=2-num_seq;
else
curr_se := num_seq-1;
end if;
DBMS_OUTPUT.PUT_LINE('4-curr_se='||curr_se);
else
curr_se := num_seq - l_val-1;
if curr_se =0 then curr_se:=curr_se+num_seq;
else
curr_se:=curr_se;
end if;
DBMS_OUTPUT.PUT_LINE('5-curr_se='||curr_se);
end if;
execute immediate
/*'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
' minvalue 0';
DBMS_OUTPUT.PUT_LINE (l_val);
execute immediate*/
'alter sequence ' || p_seq_name || ' increment by ' || curr_se ||
' minvalue 0';
DBMS_OUTPUT.PUT_LINE('6-l_val='||l_val);
execute immediate 'select ' || p_seq_name || '.nextval from dual'
INTO l_val;
DBMS_OUTPUT.PUT_LINE('7-l_val='||l_val);
execute immediate
'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
【讨论】: