一、Oracle中的定时任务的实例
1.1、创建一个测试表,只有一个DATE类型字段
CREATETABLETEST_A(TEST_ADD_DATADATE);
1.2、创建一个自定义存储过程
CREATEORREPLACEPROCEDURETEST_PROAS
BEGIN
INSERTINTOTEST_AVALUES(SYSDATE);
END;
1.3、创建定时任务JOB
DECLARE
jobnoNUMBER;
BEGIN
dbms_job.submit(
jobno,--定时器ID,系统自动获得
'TEST_PRO;',--what执行的过程名
SYSDATE,--next_date,定时器开始执行的时间,这样写表示立即执行
'TRUNC(sysdate,''mi'')+1/(24*60)'--interval,设置定时器执行的频率,这样写每隔1分钟执行一次
);
COMMIT;
END;
说明:
1、declare后面的jobno是一个数字类型,主要的用途是给定时器保存id,下面的job引用此jobno。
2、job:输出变量,是此任务在任务队列中的编号;
3、what:执行的任务的名称及其输入参数;
4、next_date:任务执行的时间;
5、interval:任务执行的时间间隔。
1.4、运行JOB(1.3执行成功后,job就已经开始执行了)
select*fromTEST_A;
1.5、关于JOB的查询操作
--查看调度任务
select*fromuser_jobs;
--查看正在执行的调度任务
select*fromdba_jobs_running;
--查看执行完的调度任务
select*fromdba_jobs;
job的id,此id不是随便填写的,而是执行select*fromuser_jobs;查询到定时任务名称对应的id。
手动执行定时任务(下面的参数25需要根据本地查询的参数来确定)
BEGIN
DBMS_JOB.RUN(25);
COMMIT;
END;
停止已启动的定时任务
BEGIN
DBMS_JOB.BROKEN(25,TRUE,SYSDATE);
COMMIT;
END;
删除指定job
BEGIN
DBMS_JOB.REMOVE(25);
commit;
END;
1.6、常见的Interval设置
描述INTERVAL参数值
每天午夜12点TRUNC(SYSDATE+1)
每天早上8点30分TRUNC(SYSDATE+1)+(8*60+30)/(24*60)
每星期二中午12点NEXT_DAY(TRUNC(SYSDATE),''TUESDAY'')+12/24
每个月第一天的午夜12点TRUNC(LAST_DAY(SYSDATE)+1)
每个季度最后一天的晚上11点TRUNC(ADD_MONTHS(SYSDATE+2/24,3),'Q')-1/24
每星期六和日早上6点10分TRUNC(LEAST(NEXT_DAY(SYSDATE,''SATURDAY"),NEXT_DAY(SYSDATE,"SUNDAY")))+(6×60+10)/(24×60)
每秒钟执行次
Interval=>sysdate+1/(24*60*60)
如果改成sysdate+10/(24*60*60)就是10秒钟执行次
每分钟执行
Interval=>TRUNC(sysdate,'mi')+1/(24*60)
如果改成TRUNC(sysdate,'mi')+10/(24*60)就是每10分钟执行次
每天定时执行
例如:每天的凌晨1点执行
Interval=>TRUNC(sysdate)+1+1/(24)
每周定时执行
例如:每周一凌晨1点执行
Interval=>TRUNC(next_day(sysdate,'星期一'))+1/24
每月定时执行
例如:每月1日凌晨1点执行
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/24
每季度定时执行
例如每季度的第一天凌晨1点执行
Interval=>TRUNC(ADD_MONTHS(SYSDATE,3),'Q')+1/24
每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
每年定时执行
例如:每年1月1日凌晨1点执行
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
1.7、编写存储过程的格式样例
--oracle存储过程格式
CREATEORREPLACEPROCEDURETEST_PRO_NAMEAS
declarecountNumINT:=0;
begin
selectcount(*)intoSM_USERfromtest2;
if(countNum=0)then
--deletefromTable
--INSERTINTOtable(col1,col2,col3)
--SELECTcol1,col2,col3FROMtableWHEREcondition;
--业务完成写日志
else
--没有数据写日志
endif;
commit;
ExceptionWhenOthersThen
rollback;
ENDTEST_PRO_NAME
补充:Oracle手动执行定时任务
Oracle数据库中的定时任务可以使用DBMS_SCHEDULER包来手动执行。下面是一个简单的步骤:
1.使用SYS或具有管理员权限的用户登录到Oracle数据库中。
2.打开SQLPlus或SQLDeveloper等工具。
3.连接到数据库,并输入以下命令以创建一个简单的定时任务:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'my_job',
job_type=>'PLSQL_BLOCK',
job_action=>'BEGINmy_procedure();END;',
start_date=>SYSTIMESTAMP,
repeat_interval=>'FREQ=HOURLY;INTERVAL=1',
enabled=>TRUE,
comments=>'Mynewjob'
);
END;
/
在上面的命令中,我们创建了一个名为"my_job"的定时任务,它每小时重复执行一次,并在启用时运行PL/SQL块。
4.执行以下命令来手动运行定时任务:
BEGIN
DBMS_SCHEDULER.RUN_JOB('my_job');
END;
/
在上面的命令中,我们手动运行名为"my_job"的定时任务。
请注意,如果你要手动执行的定时任务有任何依赖项,如数据库对象或作业链,则必须在手动运行之前确保这些依赖项已经准备就绪。
|