如何在Oracle中管理计划任务

如何在Oracle中管理计划任务,第1张

是的。以前我们在处理这类需求时也是这么做的。

但从ORACLE 10.1 版本开始,ORACLE 开发了一个新的包DBMS_SCHEDULER 。这个包挺复杂的,以至于我在初次学习之后,就没再去用它了。功能太强大了,其实很多我们不需要的。

我们就有这个需求,看看DBMS_SCHEDULER 是如何解决的。

在SQLPLUS 中,使用DBMS_SCHEDULER.CREATE_JOB 创建计划任务,用于调度一个存储过程。

存储过程很简单,我为这个测试而创建的,就是向一张表里插入数据。

CREATE TABLE T1 AS SELECT SYSDATE AS AA FROM DUAL

CREATE OR REPLACE PROCEDURE SP_TEST_T1 AS

BEGIN

INSERT INTO T1 SELECTD SYSDATE FROM DUAL

COMMIT

END

这个存储过程没有输入输出参数,是为了JOB 调用方便。如果实际运行过程中有参数,我们就写一个存储过程封装它,再放入JOB 中调用。

例如:

CREATE PROCEDURE GATHER_GTJA_STATS

AS

BEGIN

SYS.DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME =>'GTJA',ESTIMATE_PERCENT =>30,METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE AUTO',CASCADE =>TRUE,OPTIONS =>'GATHER')

END

使用DBMS_SCHEDULER.CREATE_JOB 创建一个JOB, 调用存储过程SP_TEST_T1 ,执行间隔2 分钟。这里的JOB_NAME 名称可以自己定义,这个摆脱了DBMS_JOB 中JOB 号不能自定义的缺点。

 

EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>'JOB_SP_TEST_T1',JOB_TYPE =>'STORED_PROCEDURE',JOB_ACTION =>'SP_TEST_T1' ,START_DATE =>SYSDATE ,REPEAT_INTERVAL =>'FREQ=MINUTELYINTERVAL=2')

该命令执行成功后,可以在*_SCHEDULER_JOBS 中看到JOB 的配置值。

SELECT * FROM DBA_SCHEDULER_JOBS

SELECT * FROM USER_SCHEDULER_JOBS WHERE JOB_NAME='JOB_SP_TEST_T1'

使用该命令新建的JOB ,默认是不执行的,需要将其状态改成可执行状态。

EXEC DBMS_SCHEDULER.ENABLE(NAME =>'JOB_SP_TEST_T1')

可以删除重建它。

EXEC DBMS_SCHEDULER.DROP_JOB(JOB_NAME =>'JOB_SP_TEST_T1')

EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>'JOB_SP_TEST_T1',JOB_TYPE =>'STORED_PROCEDURE',JOB_ACTION =>'SP_TEST_T1',START_DATE =>TO_DATE('2012-06-12 15:30:00','YYYY-MM-DD HH24:MI:SS') ,REPEAT_INTERVAL =>'FREQ=DAILY')

这个创建过程而言,其实和DBMS_JOB 创建JOB 的差别不大,但DBMS_SCHEDULER 可配置的地方就太多了。执行时间间隔非常非常灵活,这里不做详述了,具体请看ORACLE 官方文档。

DBMS_SCHEDULER 针对每一次JOB 执行,都做了详细记录,因此,可以查询到每一次JOB 执行的时间了。

具体可以查看两类视图*_SCHEDULER_JOB_LOG 和*_SCHEDULER_JOB_RUN_DETAILS 。

SELECT * FROM DBA_SCHEDULER_JOB_LOG

SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS

如果嫌日志太多了,可以使用PURGE_LOG 去清理。

EXECUTE DBMS_SCHEDULER.PURGE_LOG

这个DBMS_SCHEDULER 包的功能太多了,用起来也累,所以很多人还是选择DBMS_JOB 。

在你的存储过程里面定义一个变量:

v_HH24 CHAR(2) := '00'

begin后面给变量赋值:

v_HH24 := to_char(sysdate, 'HH24')

然后在你执行的代码外面加上:

IF v_HH24 = '02' THEN

你的代码

end if

然后使用下面的脚本创建job:

begin

sys.dbms_job.submit(job =>:job,

what =>'你的存储过程名字',

next_date =>to_date('01-06-2013 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),

interval =>'SYSDATE+60/1440')

commit

end

/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7950895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存