oracle的job有时执行很久,oracle job 自动执行时的奇怪现象

现在遇到一件更令人郁闷的事。用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。

先谢谢啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值