背景:
项目有个前端功能实现依赖于后台数据库定时触发某项任务。
测试环境准备创建此项数据库任务,以满足前端的测试。
参考:
https://www.cnblogs.com/linjiqin/p/3152638.html
https://www.cnblogs.com/yscit/p/10376005.html
Oralce中的任务有2种:Job和Dbms_job,两者的区别有:
1. jobs是oracle数据库的对象, dbms_jobs只是jobs对象的一个实例, 就像对于tables, emp和dept都是表的实例。
2. 创建方式也有差异,Job是通过调用dbms_scheduler.create_job包创建的,Dbms_job则是通过调用dbms_job.submit包创建的。
3. 两种任务的查询视图都分为dba和普通用户的,Job对应的查询视图是dba_scheduler_jobs和user_scheduler_jobs,dbms_jobs对应的查询视图为dba_jobs和user_jobs。
主要介绍Dbms_job
BEGIN DBMS_JOB.SUBMIT( JOB OUT BINARY_INTERGER,--输出变量,是此任务在任务队列中的编号,也可以自定义,一般不传 WHAT IN VARCHAR2,--执行的任务的名称及其输入参数 NEXT_DATE IN DATE DEFAULT SYSDATE,--任务执行的时间 INTERVAL IN VARCHAR2 DEFAULT NULL,--任务执行的时间间隔 NO_PARSE IN BOOLEAN DEFAULT FALSE,--用于指定是否需要解析与作业相关的过程 INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,--用于指定哪个例程可以运行作业 FORCE IN BOOLEAN DEFAULT FALSE--用于指定是否强制运行与作业相关的例程 ); END
练习
--1.创建表: create table testa (cola date); --2.创建存储过程: create or replace procedure testp as begin insert into testa values(sysdate); end; / --3.创建job任务(1分钟执行一次): variable jobno number; begin dbms_job.submit(:jobno,'testp;', sysdate, 'sysdate+1/24/60'); commit; end; / --4.查看任务定时执行结果: select to_char(cola,'yyyy/mm/dd hh24:mi:ss') 时间 from testa;
--5.跟踪任务的情况(查看任务队列): select job, next_date, next_sec, failures, broken from user_jobs;
--6.停止定时任务(取上一步的JOB号,停止后Broken变为Y且NEXT_SEC变为0): begin dbms_job.broken(37301, true, sysdate); commit; end; /
--7.再次启动定时任务 begin dbms_job.run(37301); end; /