背景介绍:
我们的架构要求,数据库序列在日切时重置为1。这样每天该序列最后的值就是一天的交易量。
方案介绍:
create or replace procedure seq_res_1 --创建存储过程
is
v_sql varchar2(200);
n number;
begin
select seq_name.CURRVAL into n from dual;
v_sql:='alter sequence seq_name increment by -'||n||' minvalue 0';
execute immediate v_sql;
select seq_name.nextval into n from dual;
v_sql:='alter sequence seq_name increment by '||1||' minvalue 0';
execute immediate v_sql;
end seq_res_1;
从网上百度出来的存储过程,但执行时 “ select seq_name.CURRVAL into n from dual ; ”报错:ORA-08002: 序列XXXXXXX.CURRVAL 尚未在此进程中定义。
使用下面这个存储过程:
create or replace procedure seq_res_1
is
v_sql varchar2(200);
v_step number;
begin
select xxx.nextval into v_step from dual;
v_sql := 'alter sequence xxx increment by -'||v_step||' minvalue 0';
execute immediate v_sql;
select xxx.nextval into v_step from dual;
v_sql := 'alter sequenct xxx increment by '||1||' minvalue 0';
execute immediate v_sql;
end seq_res_1;
一、模拟日切前交易量
select xxx.nextval form dual; --执行N多次,序列当前值为999
二、执行存储过程
第一步:设置序列步长为 (-999)
第二步:取下一个序列值 999 + (-999)=0
第三步:设置序列步长为1
三、存储过程执行完成,新交易发生
select xxx.nextval from dual ; -- 此时序列值为 0 + (1)=1
但不知道这个存储过程会有什么影响,,,