请教各位,我有如下需求,请帮忙指点。
1. 计数器
用数据库维护一个序列号, 这个序列号初始值为0, 每次查询后其值加1, 当超过一个最大值时, 重新设置为0.
用任何你认为最优的方式实现这个计数器. 请用存储过程提供查询, 重新置零的程序调用接口.请提供用来生成这个计数器的所有SQL语句, 以及操作计数器的存储过程.
谢谢各位了
1. 计数器
用数据库维护一个序列号, 这个序列号初始值为0, 每次查询后其值加1, 当超过一个最大值时, 重新设置为0.
用任何你认为最优的方式实现这个计数器. 请用存储过程提供查询, 重新置零的程序调用接口.请提供用来生成这个计数器的所有SQL语句, 以及操作计数器的存储过程.
谢谢各位了
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;
minvalue 0
maxvalue 99999
start with 1
increment by 1
nocache
cycle;
一个函数就差不多了. JUST FYI ..
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;
/
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;
create sequence seq_1
minvalue 0
maxvalue 10
start with 1
nocache
cycle;就可以實現你所要的功能