一天执行一次?0点?
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate)+1');
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate)+1');
解决方案 »
- [在线等...](java)Oracle中Long类型存储
- 字符串 怎么转换成long型?
- oracle 初学者的配置环境????
- 关于pl/sql和oracle的关系
- 要用到表之间的关联,但是数据量很大,那么如何优化?有哪些办法?谢谢!
- SQL Server的@@Identity在Oracle中怎么改写?
- 为什么我在存储过程中使用dba_free_spaces之类的视图时,oracle总提示没有定义的变量?
- 关于Asp调用Oracle序列的小问题
- 如何显示一个库中所有的表以及显示一个表的结构
- 有个难点,求教各路大神
- oracle8i for windowsNT实用指南上第四章的source code。看不懂。
- 怪、怪、怪!
你上面写的是什么时候提交就什么时候执行,频率是一天一次,
每天多点执行一次应该是:
dbms_job.submit(jobno,'pro;',to_date(to_char(sysdate,'yyyy-mm-dd')||' 00:00:00'),'yyyy-mm-dd hh24:mi:ss'),'trunc(sysdate)+1');
但这些都不是我的问题!
dbms_job.submit(jobno,'pro;',trunc(sysdate),'sysdate+1/(24*60)'); /一分钟
->但是我写的作业是希望他 一秒 执行一次的 你想不执行完当前的作业继续作下一个是不可能的
-------------------
2003-09-08 11:08:28
2003-09-08 11:09:30
2003-09-08 11:10:31
2003-09-08 11:11:33
2003-09-06 17:39:00
2003-09-06 17:40:02
2003-09-06 17:41:04
2003-09-06 17:42:05
2003-09-06 17:43:07
2003-09-06 17:44:08
2003-09-06 17:45:10
他是一分零一秒执行一次。多一秒是因为那过程的执行时间大概是一秒。现在假设我建立的作业是1天执行一次(必须在00:00:00执行),
如果那过程要30分钟才执行完成,那么下次的执行时间还是00:00:00吗?肯定不是了,你看上面的数据就知道了,应该是在00:30:00。但是我要求必须在00:00:00执行。
-------------------
2003-09-08 10:57:12 //假设那作业是在2003-09-08 10:57:12开始。那应该是:
2003-09-08 10:58:13 2003-09-08 10:58:12
2003-09-08 10:59:15 2003-09-08 10:59:12
2003-09-08 11:00:16 2003-09-08 11:00:12
2003-09-08 11:01:18 2003-09-08 11:01:12
2003-09-08 11:02:19 ....
2003-09-08 11:03:21
2003-09-08 11:04:22
2003-09-08 11:05:24
2003-09-08 11:06:25
2003-09-08 11:07:27
你的 pro 都要执行一分多钟啊!怎么可能设置一个 job 让它一秒执行一次???
要不多设几个 job 啊?不过又很难保证同一秒只有一个 pro 在执行哦!
我认为这样写没有问题:
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate)+1');测试的话用:间隔1分钟
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,'mi')+1/(24*60)');测试结果贴出来看看,应该没问题
你把前面的全忘记掉!
再看?:
假设现在的PRO要30分钟来执行。我现在需要一天执行一次。必须在00:00:00执行。
但是结果是第一天执行的时候是准确的,在00:00:00。但第二天是在00:30:00
第三天是在01:00:00。
不要告诉我是因为你的PRO药0分钟执行。
我现在要的是要次次都在00:00:00执行。不管你PRO要执行多久。(反正会出现一次没有执行完下次执行时间又到了)
我认为这样写没有问题:
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate)+1');测试的话用:间隔1分钟
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,'mi')+1/(24*60)');测试结果贴出来看看,应该没问题
*
ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 62 列:
PLS-00103: 出现符号 "MI"在需要下列之一时:
.(),*@%&|=-+</>atinmodnot
rangerem=>..<an exponent (**)><> or != or ~=>=<=<>andorlike
betweenis nullis not||is dangling
符号 ".在 "MI" 继续之前已插入。
建立成功。
结果等下再看。
TO_CHAR(B,'YYYY-MM-
-------------------
2003-09-08 15:01:00
2003-09-08 15:02:01
2003-09-08 15:03:03
2003-09-08 15:04:04
他是一秒多一点执行一次。
我现在要求的是执行的开始时间!!!。
我现在没有环境,有的话一定试一下
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select trunc(sysdate,'mi') from dual;
我看一下你执行的结果
-------------------
2003-09-08 15:17:00
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,'mi')+1/(24*60)');
还是:
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,''mi'')+1/(24*60)');
第一个我执行的时候包错。
第二个可以完成。
我正在装数据库,等会儿我自己做一下
如果trunc(sysdate,''mi'')的话就是在每分钟的开始的地方执行?
我大概明白你的意思,你看:
A B
---------- -------------------
1 2003-09-08 15:30:23
1 2003-09-08 15:31:04
1 2003-09-08 15:32:06
1 2003-09-08 15:33:07
1 2003-09-08 15:34:09
1 2003-09-08 15:35:10
我在执行建立作业的语句的时间是在2003-09-08 15:30:23,他立即执行了一次作业的过程。,到了下一分钟,虽然时间没有到我们社顶的间隔,但是到了每分钟的开始,所以又执行了一次,但是下面就不是这样了。接着就是一直加上去了。也就是说在第二次作业执行的时候那TRUNC有用,。接下来又没用了。
1 2003-09-08 15:30:23//刚提交时候执行的
1 2003-09-08 15:31:04//
1 2003-09-08 15:32:06
1 2003-09-08 15:33:07
1 2003-09-08 15:34:09
1 2003-09-08 15:35:10//到10秒了。
1 2003-09-08 15:36:01//又回到01开始执行了
1 2003-09-08 15:37:03
1 2003-09-08 15:38:04
1 2003-09-08 15:39:06
1 2003-09-08 15:40:07
1 2003-09-08 15:41:09
1 2003-09-08 15:42:10//加到10
1 2003-09-08 15:43:01//又到01了。
如果我要他每天在00:00:00执行是不是就这样:
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,''dd'')+1/(24*60)');
?????
他就一定会在每天的凌晨执行?虽然不能精确到00:00:00,但至少也叫做是晚上啊!。
以后那时间的推迟只要不是垒加就可以了,偏差到一定的时候她会去调整就可以了。
比如:
dbms_job.submit(jobno,'pro;',trunc(sysdate),'trunc(sysdate,''dd'')+1/(24*60)');
他就在今天晚上00:00:00才运行?
是不是:
dbms_job.submit(jobno,'pro;',to_date('2003-9-8 00:00:00','yyyy-mm-dd hh24:mi:ss'),'trunc(sysdate,''dd'')+1/(24*60)');
已连接。
SQL> create table t_dtime(c_time date);表已创建。SQL> declare
2 jobno number;
3 begin
4 dbms_job.submit(jobno,'insert into t_dtime values(sysdate);',trunc(sysdate),'trunc(sysdate,'
i'')+1/(24*60)');
5 commit;
6 end;
7 /PL/SQL 过程已成功完成。SQL> select last_date,next_date from all_jobs;LAST_DATE NEXT_DATE
------------------- -------------------
2003-09-08 16:11:09 2003-09-08 16:12:00SQL> /LAST_DATE NEXT_DATE
------------------- -------------------
2003-09-08 16:12:01 2003-09-08 16:13:00SQL> select last_date,next_date from all_jobs;LAST_DATE NEXT_DATE
------------------- -------------------
2003-09-08 16:13:02 2003-09-08 16:14:00SQL> select * from t_dtime;C_TIME
-------------------
2003-09-08 16:09:47
2003-09-08 16:10:07
2003-09-08 16:11:09
2003-09-08 16:12:01
2003-09-08 16:13:02SQL> select * from t_dtime;C_TIME
-------------------
2003-09-08 16:09:47
2003-09-08 16:10:07
2003-09-08 16:11:09
2003-09-08 16:12:01
2003-09-08 16:13:02SQL> select last_date,next_date from all_jobs;LAST_DATE NEXT_DATE
------------------- -------------------
2003-09-08 16:15:04 2003-09-08 16:16:00SQL> select * from t_dtime;C_TIME
-------------------
2003-09-08 16:09:47
2003-09-08 16:10:07
2003-09-08 16:11:09
2003-09-08 16:12:01
2003-09-08 16:13:02
2003-09-08 16:14:03
2003-09-08 16:15:04已选择7行。SQL>
每次系统调用执行job花费的时间可能有长有短,但next_date是不会有偏差所以用'trunc(sysdate,''dd'')+1,肯定没有问题!
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);