你在oracle中非常新,当你达到最大值时如何捕获并重置序列号:
这是序列脚本:
CREATE SEQUENCE idctr_seq
MINVALUE 1
MAXVALUE 99
START WITH 1
INCREMENT BY 1
CACHE 10;
然后是这个代码,当序列达到最大值时,它尝试将值重置为1。如果代码有效,我稍后会将其转换为函数,但它会失败。
declare
seq_num number;
exceed_maxvalue exception;
pragma exception_init(exceed_maxvalue,-8004);
begin
seq_num := idctr_seq.nextval;
DBMS_OUTPUT.PUT_LINE(seq_num);
exception
when exceed_maxvalue then
execute immediate 'sequence idctr_seq increment by -99 minvalue 0';
execute immediate 'select idctr_seq.nextval from dual';
execute immediate 'alter sequence idctr_seq increment by 1 minvalue 0';
end;
如果我运行代码直到它达到最大值,它不会产生错误,但它也不会将自身重置为1.
答案 0 :(得分:5)
这是CYCLE关键字的用例;引用
表示序列在达到其最大值或最小值后继续生成值。在升序序列达到其最大值后,它将生成其最小值。在降序序列达到最小值后,它会生成最大值。
您的对象声明应该变为:
CREATE SEQUENCE idctr_seq
MINVALUE 1
MAXVALUE 99
START WITH 1
INCREMENT BY 1
CACHE 10
CYCLE;
这是一个较小序列的演示
SQL> create sequence test_seq start with 1 maxvalue 3 nocache cycle;
Sequence created.
SQL> select test_seq.nextval from dual;
NEXTVAL
----------
1
SQL> select test_seq.nextval from dual;
NEXTVAL
----------
2
SQL> select test_seq.nextval from dual;
NEXTVAL
----------
3
SQL> select test_seq.nextval from dual;
NEXTVAL
----------
1
答案 1 :(得分:2)
你想要做的事情没有意义。
如果您希望序列在达到99后再次从1开始,只需在创建序列而不是默认值CYCLE
时指定NOCYCLE
CREATE SEQUENCE idctr_seq
MINVALUE 1
MAXVALUE 99
START WITH 1
INCREMENT BY 1
CACHE 10
CYCLE;
当然,在很多情况下,你真的想让一个序列循环 - 通常,你会声明这个列足够大,可以处理你可以设想生成的许多值。序列在达到其默认值maxvalue
之前可能会生成几乎不可思议的大量值。