现在遇到一件更令人郁闷的事。用JOB是为了定时重置SEQUENCE。可是有如下现象。
================================================================
--创建测试用序列
--create sequence for test
create sequence seq_test
minvalue 1
maxvalue 9
start with 1
increment by 1
nocache;
--创建测试用过程
--create procedure pro_test for test
create or replace procedure pro_reset_seq(v_seqname varchar2)
as
n_temp number(10);
s_tsql varchar2(100);
begin
execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp;
if n_temp <> 1 then
n_temp := -(n_temp-1);
s_tsql := ' alter sequence ' || v_seqname || ' increment by ' || n_temp;
execute immediate s_tsql;
execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp;
s_tsql := ' alter sequence ' || v_seqname || ' increment by 1 ';
execute immediate s_tsql;
end if;
end;
--取消限制模式
--change the authority of job query
alter system disable restricted session;
--创建测试用任务
--create job for test
variable job1 number;
begin
dbms_job.submit(:job1,'pro_reset_seq(''seq_test'');',sysdate,'sysdate + 1/1440'); --特意设成每分钟,这样看结果等的时间短一点,呵呵
commit;
end;
********************************************************************
郁闷的事情出现了:
1、让序列seq_test的值变化
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
SQL> /
NEXTVAL
----------
4
SQL>
2、取得JOBNO
SQL> select job from user_jobs;
JOB
----------
9
SQL>
为了确定让JOB执行,特意先执行了
begin
dbms_job.run(9);
end;
3、取得次回执行时间
SQL> select next_date,next_sec from user_jobs where job=9
2 /
NEXT_DAT NEXT_SEC
-------- ----------------
06-02-08 17:57:20
SQL>
4、一分钟后再取次回执行时间
SQL> /
NEXT_DAT NEXT_SEC
-------- ----------------
06-02-08 17:58:22
SQL>
很明显,执行时间是变化的, 可是, 我再查看seq_test的序列值时,郁闷的事情来了。
SQL> select seq_test.currval from dual;
CURRVAL
----------
4
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
SQL>
/=======================/
然而,如果我手动执行任务
然后再查看seq_test的序列值就没有这种现象。如下
SQL> begin
2 dbms_job.run(9);
3 end;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL> select seq_test.currval from dual;
CURRVAL
----------
1
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
SQL>
*************************************************************************
有么有哪位大侠能帮偶解释一下?
做那么乱七八糟的事,其实就是为了实现定时重置SEQUENCE。
先谢谢啦。