序列超过最大值时的异常处理

时间:2014-09-09 07:01:42

标签: oracle

你在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.

2 个答案:

答案 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之前可能会生成几乎不可思议的大量值。