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

前端之家收集整理的这篇文章主要介绍了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.

解决方法

这是 CYCLE关键字的用例;报价

indicate that the sequence continues to generate values after reaching either its maximum or minimum value. After an ascending sequence reaches its maximum value,it generates its minimum value. After a descending sequence reaches its minimum,it generates its maximum value.

您的对象声明应该变为:

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

猜你在找的Oracle相关文章