但从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
/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)