十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
特别提示:
成都创新互联公司-专业网站定制、快速模板网站建设、高性价比岭东网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式岭东网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖岭东地区。费用合理售后完善,10年实体公司更值得信赖。
oracle是执行完任务,才按照interval去计算下次执行时间!!!
为精确每个5分钟执行一个任务,必须自己计算时间。
如:trunc_minute(sysdate)+5/1440
create or replace function trunc_minute(v_date date) return date as
begin
return to_number(trunc(to_char(v_date, 'mi')/5))*5/(24*60) + trunc(v_date, 'hh24');
end;
工作中,我们使用的数据库大部分是oracle、mysql、db2、sql server等数据库,在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢看下面我简单介绍使用工具创建定时器的方法。
1. oracle job可用来完成一些后台数据库定时任务,支持SQL、PL/SQL等,具体语法可以参考有关资料,简单的话可以使用TOAD,PLSQL Developer这种工具。
2. select * from table1 for update; 锁定此表其它用户不可以执行写入操作。
3. EM即Enterprise Manager,代替8i中Enterprise Manager Console的一个BS工具,浏览器中访问,首先要安装配置正确,服务开启,可以用这个工具完成很多数据库管理维护的工作,非常强大的工具,
不知道我的回答是否全面,具体的需要你查找手册仔细研究的。
在DBMS_JOB 使用中,我们需要知道每一次JOB 执行的时间,用于判断该JOB 调用的存储过程执行时间。这里你会说,这个在存储过程里也可以实现的,在存储过程中,执行前后加个时间戳记录到日志表中就可以实现。
是的。以前我们在处理这类需求时也是这么做的。
但从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=MINUTELY; INTERVAL=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 。
可以用图形化界面来创建JOB,如图:在PL/SQL的项目DBMS_JOBS中进行新建。
填写好上面标红的地方后,点击应用即可生成计划!
在你的存储过程里面定义一个变量:
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;
/