请教各位,我有如下需求,请帮忙指点。
1. 计数器
用数据库维护一个序列号, 这个序列号初始值为0, 每次查询后其值加1, 当超过一个最大值时, 重新设置为0.
用任何你认为最优的方式实现这个计数器. 请用存储过程提供查询, 重新置零的程序调用接口.请提供用来生成这个计数器的所有SQL语句, 以及操作计数器的存储过程.
谢谢各位了

解决方案 »

  1.   

    给个简单的参考例子: create table t(pk number primary key,...); 
    create sequence t_seq; 
    create trigger t_trigger before insert on t for each row 
    begin 
      select t_seq.nextval into :new.pk from dual; 
    end; 
      

  2.   

    弄个sequence,从0开始到99999,然后循环create sequence SEQ_ID
    minvalue 0
    maxvalue 99999
    start with 1
    increment by 1
    nocache
    cycle;
      

  3.   

    可以考虑写一个和SEQUENCE_NAME.NEXTVAL差不多功能的自定义函数.里面传3个参数值:现在的数值,增值浮度,最大值.
    一个函数就差不多了. JUST FYI ..
      

  4.   

    DROP SEQUENCE seq_1;
    create sequence SEQ_1
    minvalue 0 
    maxvalue 5 
    start with 1
    nocache 
    cycle;--取值的方法
    CREATE OR REPLACE PROCEDURE get_val(p_out OUT INT) IS
    BEGIN
    SELECT seq_1.nextval INTO p_out FROM dual;
    END;
    /--清零方法
    CREATE OR REPLACE PROCEDURE SET_ZERO IS
    BEGIN
      EXECUTE IMMEDIATE 'drop sequence seq_1';
      EXECUTE IMMEDIATE 'create sequence SEQ_1 minvalue 0 maxvalue 5 start with 1 nocache cycle';
    END;
    /--测试
    DECLARE
     l_n INT;
    BEGIN
     get_val(l_n);
     dbms_output.put_line(l_N);
     --set_zero();
    END;
    /
      

  5.   

    create sequence seq_test 
    increment by 1
    start with 1
    maxvalue 99999
    CYCLE;

    create or replace function f_serial_no
    --获取序列号
    return number
    AS
    ret NUMBER;
    BEGIN
    SELECT seq_test.nextval
      INTO ret
      FROM DUAL;

    RETURN ret;
    END;

    CREATE OR REPLACE PROCEDURE reset_serail_no
    --重置接口为1
    AS
    v_no NUMBER;
    BEGIN
    v_no := f_serial_no;
    execute immediate 'ALTER sequence seq_test INCREMENT BY -' || v_no;
    v_no := f_serial_no;
    EXECUTE IMMEDIATE 'ALTER sequence seq_test INCREMENT BY 1';
    END;
      

  6.   

    在oracle中这个就序列,不用写成存储过程!
      

  7.   

    sequence加上触发器就可以实现你的要求
      

  8.   

    不需要寫procedure,隻需要用一個序列:
    create sequence seq_1
    minvalue 0 
    maxvalue 10 
    start with 1
    nocache 
    cycle;就可以實現你所要的功能
      

  9.   

    如是不是作为主键值,创建sequence 为cycle即可,即达到最大值时将重新开始计数;