oracle怎么实现每天定时执行一个计划任务

轻松工作快乐生活 2005-10-25 03:01:46
我是新手,刚刚开始接触oracle,现在是什么都头脑.领导让我实现一个在晚上去执行一个存储过程或什么的处理白天大量数据业务的程序.由于对oracle一点都不熟,根据不知道从哪下手,请各位大侠帮忙.
...全文
2269 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢各位.看来还得好好学学pl/sql了,基本已经知道是怎么个过程了,剩下就得自己努力去学写业务的语句了.结贴
mayongzhi 2005-10-25
  • 打赏
  • 举报
回复

一个简单例子:

创建测试表
SQL> create table a(a date);

表已创建。

创建一个自定义过程
SQL> create or replace procedure test as
2 begin
3 insert into a values(sysdate);
4 end;
5 /

过程已创建。

创建JOB
SQL> variable job1 number;
SQL>
SQL> begin
2 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次
3 end;
4 /

PL/SQL 过程已成功完成。

运行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /

PL/SQL 过程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;

时间
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

删除JOB
SQL> begin
2 dbms_job.remove(:job1);
3 end;
4 /

PL/SQL 过程已成功完成。


select job,to_char(next_date,'yyyy-mm-dd hh24:mi:ss') from all_jobs;


----------job的使用:

DBMS_JOB.SUBMIT(:jobno,//job号
'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);
例子:
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'Procdemo;',//Procdemo为过程名称
SYSDATE, 'SYSDATE + 1/720');
commit;
end;

-----修改job_queue_processes的值(保证其不为0否则JOB不自动运行)
可通过select * from v$parameter;查看其值;
方法1,startup pfile='C:\oracle\ora90\database\initorcl.ora';
需要修改initorcl.ora文件的job_queue_processes参数,然后重新启动数据库以后才能生效
方法2,alter system set job_queue_processes=10
不需要重新启动数据库就能生效,系统自动修改init.ora文件
waterfirer 2005-10-25
  • 打赏
  • 举报
回复
先把处理白天大量数据业务的存储过程写好,然后建job。

btw:qiaozhiwei(乔)升级了,祝贺祝贺。快发帖散分啊 :)
doulikeme 2005-10-25
  • 打赏
  • 举报
回复
补充楼上的:

其实就是2种,一种是ORACLE内部的JOB,一种是通过外部检测来判断是否要执行这个过程。

用JOB也是比较方便的,其实比在外部检测要简单点,例如:

begin
sys.dbms_job.submit(job => :job,
what => DoSomething;',
next_date => to_date('20-10-2005 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'trunc(SYSDATE + 1,''mi'')');
commit;
end;


就是让在2005-10-20 01:00:00开始执行DoSomething过程,以后每隔1天做一次
qiaozhiwei 2005-10-25
  • 打赏
  • 举报
回复
可以考虑三个方法:
1、用oracle的job来完成
2、写个批处理文件,用windows的计划任务实现
3、oracle中建表,写过程,外部写程序调用(线程不断检查有没有要执行的任务)

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧