2013/11/18
一、概述
二、操作步骤
--本次实验在SCOTT用户下操作,对scott赋予了DBA的权限!方便后续建表,建job等操作!
1.定义一张表test_stu
create table test_Stu(
);
--向表中插入数据
insert into test_stu values(1,'tom','c1',to_date('18-11-13','dd-mm-yy'));
insert into test_stu values(2,'jack','c2',to_date('18-11-13','dd-mm-yy'));
insert into test_stu values(3,'lily','c2',to_date('18-11-13','dd-mm-yy'));
insert into test_stu values(4,'lucy','c3',to_date('18-11-13','dd-mm-yy'));
insert into test_stu values(5,'lilei','c1',to_date('18-11-13','dd-mm-yy'));
commit;
2.定义一个存储过程
--更新表数据,将inrolldate加1天
create or replace procedure change_date
is
begin
end change_date;
---------------------------------------
3.设置初始化参数
--使用dbms_job管理作业必须确保指定了初始化参数job_queue_processes。
--必须在sys用户下执行,scott用户无权限!
alter system set job_queue_processes=n;--(n>0且job_queue_processes最大值为1000)
---------------------------------------
4.创建job
--执行的存储过程名参数最后别忘记加“;”号!
--这里指定一分钟执行一次
--第一种创建方式
declare
jobno number;
begin
sys.dbms_job.submit(jobno,'change_date;',sysdate,'sysdate+1/1440');
commit;--必须有commit,如果没有是查不到该job的!!!
end;
/
--另外一种创建方式
variable jobno number;
begin
sys.dbms_job.submit(job => :jobno,
what => 'change_date;',
next_date => to_date('18-11-2013', 'dd-mm-yyyy'),
interval => 'sysdate+1/1440');--每天1440分钟,即一分钟运行change_date过程一次
commit; --必须有commit,如果没有是查不到该job的!!!
end;
/
----------------------
5.查看创建的job
--查看相关job信息的相关视图
--dba_jobs
--all_jobs
--user_jobs
--dba_jobs_running 包含正在运行job相关信息。
select * from user_jobs;
--查询到作业号为:23.
---------------------------
6.手动立即运行job
需要手动立即运行该job才用run过程,注意与submit的区别:
submit时就已经指定了job的运行时间和间隔,所以submit后不需要执行run,需要立即运行一次job时才调用run。
EXEC dbms_job.run(23);
或者
begin
dbms_job.run(23);
end;
/
或者
exec dbms_job.broken(23,false);
-----------------------------------
7.停止job
exec dbms_job.broken(23,true);
COMMIT;
8.删除job
--记得提交!!否则查询仍然有此job。
--第一种job创建方式不能用此方式删,否则提示:并非所有的变量都已绑定!具体见博客:
http://blog.sina.com.cn/s/blog_62defbef0101opcw.html
EXEC dbms_job.remove(:jobno);
commit;
如果知道作业号可以用作业号代替:job
EXEC dbms_job.remove(23);
commit;
9.修改JOB
--修改作业相关信息
--此处设置一天执行一次
exec dbms_job.change(23,null,null,'sysdate+1');
------------------------------------------------------
--*****************************************************
附:
dbms_job包介绍
该包包含以下子过程:
-------------------
Run()
Broken()
change()
What()
Interval()
Isubmit()
User_Export()
--------------------
1、Submit()
该过程用于提交一个job。
语法:
PROCEDURE Submit ( job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
参数:
job:是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个job。
what:是将被执行的PL/SQL代码块。
next_date:指识何时将运行这个job。
interval:何时这个job将被重执行。
no_parse:指示此job在提交时或执行时是否应进行语法分析——TRUE指示此PL/SQL代码在它第一次执行时应进行
语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
----------------------
2、Run()
该过程用来立即执行一个指定的job。
一般用于手动执行一个job。
语法:
PROCEDURE Run(job IN binary_ineger)
参数:
job:job号。
----------------------
3、Broken()
该过程更新一个已提交的job的状态,用来停止或者重启一个job。
语法:
PROCEDURE Broken (job IN binary_integer,
Broken IN boolean,
next_date IN date :=SYSDATE)
参数:
job参数是job号。
broken:此job是否停止——TRUE说明此job将标记为停止,而FLASE说明此job将标记为未停止。
next_date:在什么时候此job将再次运行。此参数缺省值为当前日期和时间。
注意:job如果由于某种原因未能成功执行,oracle重试16次后,还未能成功执行,该job将被标记为broken。
--重新启动状态为broken的job,有如下两种方式;
a、利用dbms_job.run()立即执行该job
begin
dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number
end;
/
b、利用dbms_job.broken()重新将broken标记为false
begin
end;
/
---------------------------------------------
4、Remove()
该过程删除一个已计划运行的job。
语法:
PROCEDURE Remove(job IN binary_ineger);
参数:
job:job号。这个参数的值是由为此job调用Submit()过程返回的job参数的值。
---------------------------------------------
5、Change()
该过程用来改变指定job的设置。
语法:
PROCEDURE Change (job IN binary_integer,
What IN varchar2,
next_date IN date,
interval IN varchar2)
参数:job、what 、next_date与interval。
job:job号。
What:由此job运行的一块PL/SQL代码块,一般为函数或者存储过程。
next_date:何时此job将被执行。
interval:job重执行的间隔。
--------------------------------------------
6、What()
该过程应许在job执行时重新设置此正在运行的命令。
语法:
PROCEDURE What (job IN binary_ineger,
What IN OUT varchar2)
参数:job与what。
job:一个存在的job。
what:将被执行的新的PL/SQL代码。
----------------------------
7、Next_Date()
该过程用来显式地设定一个job的执行时间。
语法:
PROCEDURE Next_Date(job IN binary_ineger,
next_date IN date)
参数:job与next_date。
job:job号。
next_date:此job应被执行的日期与时间。
---------------------------------------------
8、Interval()
该过程指定执行一个job的时间间隔。
语法:
PROCEDURE Interval (job IN binary_integer,
Interval IN varchar2)
参数:job与interval。
job:job号。
interval:指示一个job重执行的间隔。
------------------
附常见interval设置:
描述
每天午夜12点
每天早上8点30分
每星期二中午12点
每个月第一天的午夜12点
每个季度最后一天的晚上11点
每星期六和日早上6点10分
--------------------------------------------
9、ISubmit()
该过程用来用特定的job号提交一个job。即跨作业提交。
语法:
PROCEDURE ISubmit (job IN binary_ineger,--注意这里job为in类型!
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
参数:job、what、next_date、interval与no_parse。
这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的job号。
如果提供的job号已被使用,将产生一个错误。
---------------------------------------------
10、User_Export()
该过程返回一个命令,此命令用来安排一个存在的job以便此job能重新提交。
语法:
PROCEDURE User_Export(job IN binary_ineger,
my_call IN OUT varchar2)
参数:job与my_call。
job:标识一个安排了的job。
my_call:包含在它的当前状态重新提交此job所需要的正文。
------------------------------------------------------------