oracle dbmsjob.docx
《oracle dbmsjob.docx》由会员分享,可在线阅读,更多相关《oracle dbmsjob.docx(11页珍藏版)》请在冰点文库上搜索。
oracledbmsjob
创建一个简单的JOB实列
对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,
或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作。
job参数是由Submit()过程返回的binary_ineger。
这个值用来唯一标识一个工作;
what参数是将被执行的PL/SQL代码块;
next_date参数指识何时将运行这个工作。
写Job的时候可以不指定该值;
interval参数何时这个工作将被重执行。
其中Interval这个值是决定Job何时,被重新执行的关键。
例如:
有存储过程p_dosomethings,需要被不同的时间间隔执行。
1declare
2 jobnonumber;
3begin
4 dbms_job.submit(
5 jobno,
6 'p_dosomething;',--what
7 to_date('20090101020000','yyyy-mm-ddhh24:
mi:
ss'),--next_date,可以不填
8 'Interval时间字符串'--interval,关键设置
9 );
10 commit;
11end;
12
1、每分钟执行
Interval=>TRUNC(sysdate,’mi’)+1/(24*60)
2、每天定时执行
例如:
每天的凌晨2点执行
Interval=>TRUNC(sysdate)+1+2/(24)
3、每周定时执行
例如:
每周一凌晨2点执行
Interval=>TRUNC(next_day(sysdate,'星期一'))+2/24
4、每月定时执行
例如:
每月1日凌晨2点执行
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5、每季度定时执行
例如每季度的第一天凌晨2点执行
Interval=>TRUNC(ADD_MONTHS(SYSDATE,3),'Q')+2/24
6、每半年定时执行
例如:
每年7月1日和1月1日凌晨2点
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7、每年定时执行
例如:
每年1月1日凌晨2点执行
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
示例
1、创建测试表
SQL>createtablezy_table(zdate,yvarchar2(10));
表已创建。
2、创建一个自定义过程
SQL>createorreplaceprocedurezy_procas
begin
insertintozy_tablevalues(sysdate,'start');
begin
dbms_stats.gather_schema_stats(ownname=>'ABM',cascade=>TRUE);
end;
insertintozy_tablevalues(sysdate,'end');
end;
/
过程已创建。
3、创建JOB
SQL>declare
SQL>job1number;
SQL>begin
dbms_job.submit(job1,'zy_proc;',sysdate,'trunc(SYSDATE)+1/24');
end;
/
PL/SQL过程已成功完成。
4、运行JOB
SQL>begin
dbms_job.run(:
job1);
end;
/
PL/SQL过程已成功完成。
SQL>selectto_char(z,'yyyy/mm/ddhh24:
mi:
ss')时间fromzy_table;
时间
-------------------
2001/01/0723:
51:
21
2001/01/0723:
52:
22
2001/01/0723:
53:
24
5、删除JOB
SQL>begin
dbms_job.remove(:
job1);
end;
/
PL/SQL过程已成功完成。
6、一些必要的参数
修改initsid.ora参数
job_queue_processes=4
job_queue_interval=10
job_queue_keep_connections=true
修改可执行作业个数为20个
ALTERSYSTEMSETJOB_QUEUE_PROCESSES=20
修改取消限制模式
ALTERSYSTEMDISABLERESTRICTEDSESSION;
7、两个必要的表
user_jobs及dba_jobs_running
8、相关的几个JOB操作
删除job:
dbms_job.remove(jobno);
修改要执行的操作:
job:
dbms_job.what(jobno,what);
修改下次执行时间:
dbms_job.next_date(job,next_date);
修改间隔时间:
dbms_job.interval(job,interval);
停止job:
dbms_job.broken(:
job1,broken,nextdate);
启动job:
dbms_job.run(jobno);
9、几个常用的语句
selectto_char(z,'yymmddhh24:
mi:
ss'),bfromzy_table;
selectjob,last_date,last_sec,next_date,next_sec,whatfromdba_jobs;
selectjob,last_date,last_sec,next_date,next_sec,what,failuresfromuser_jobs;
dbms_job.submit(:
job1,'test;',trunc(SYSDATE)+13.6/24,'SYSDATE+5/1440');
selectto_char(sysdate,'yymmddhh24:
mi:
ss')fromdual;
10、需要注意的问题:
1)job的下一次执行时间的确定:
一个job必须run一次之后,才能按照设定的间隔确定下次运行的时间。
2)如果job运行时间小于两次的间隔,则下次运行时间等于job开始运行时间+间隔时间;如果job运行时间大于等于两次的间隔,则下次运行时间等于上次job运行结束的时间。
创建Oraclejob的一些注意事项
1.设置初始化参数,job_queue_processes
altersystemsetjob_queue_processes=一个数
2.创建job应用
begin
sys.dbms_job.submit(job=>:
job,what=>'fengtry;',next_date=>sysdate,interval=>'sysdate+1');
commit;
end;
3.注意事项:
what后面跟的存储过程要有分号,next_date的参数是日期型,
interval是个日期格式的字符串+几代表每隔多长时间执行一次
一、设置初始化参数job_queue_processes
设置可同时存在运行的job进程数
sql>altersystemsetjob_queue_processes=n;--(n>0)
job_queue_processes最大值为1000
修改取消限制模式
ALTERSYSTEMDISABLERESTRICTEDSESSION;
查看jobqueue后台进程
sql>selectname,descriptionfromv$bgprocess;
二,dbms_jobpackage用法介绍
包含以下子过程:
Broken()暂停job。
change()改变正在运行的job设置。
Interval()修改时间间隔。
Submit()提交job,获得一个进程号。
Run()运行已经提交的job。
Isubmit()用指定进程号的方式提交job。
Next_Date()修改下次执行时间。
Remove()删除job。
User_Export()过程。
What()修改job执行内容。
1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已暂停工作标记为未暂停工作。
这个过程有三个参数:
job、broken与next_date。
PROCEDUREBroken(job INbinary_integer,
Broken INboolean,
next_dateINdate:
=SYSDATE)
job参数是工作号,它在进程中唯一标识工作。
broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。
next_date参数指示在什么时候此工作将再次运行。
此参数缺省值为当前日期和时间。
job如果由于某种原因未能成功之行,oracle将重试16次后,还未能成功执行,将被标记为broken重新启动状态为broken的job,有如下两种方式;
a、利用dbms_job.run()立即执行该job
sql>begin
sql>dbms_job.run(:
jobno)该jobno为submit过程提交时返回的jobnumber
sql>end;
sql>/
b、利用dbms_job.broken()重新将broken标记为false
sql>begin
sql>dbms_job.broken(:
job,false,next_date)
sql>end;
sql>/
2、Change()过程用来改变指定工作的设置。
这个过程有四个参数:
job、what、next_date与interval。
PROCEDUREChange(job INbinary_integer,
What INvarchar2,
next_date INdate,
interval INvarchar2)
此job参数是一个整数值,它唯一标识此工作。
What参数是由此工作运行的一块PL/SQL代码块。
next_date参数指示何时此工作将被执行。
interval参数指示一个工作重执行的频度。
3、Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。
这个过程有两个参数:
job与interval。
PROCEDUREInterval(job INbinary_integer,
IntervalINvarchar2)
job参数标识一个特定的工作。
interval参数指示一个工作重执行的频度。
4、ISubmit()过程用来用特定的工作号提交一个工作。
这个过程有五个参数:
job、what、next_date、interval与no_parse。
PROCEDUREISubmit(job INbinary_ineger,
What INvarchar2,
next_dateINdate,
interval INvarchar2,
no_parse INbooean:
=FALSE)
这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。
如果提供的工作号已被使用,将产生一个错误。
5、Next_Date()过程用来显式地设定一个工作的执行时间。
这个过程接收两个参数:
job与next_date。
PROCEDURENext_Date(job INbinary_ineger,
next_date INdate)
job标识一个已存在的工作。
next_date参数指示了此工作应被执行的日期与时间。
6、Remove()过程来删除一个已计划运行的工作。
这个过程接收一个参数:
PROCEDURERemove(jobIN binary_ineger);
job参数唯一地标识一个工作。
这个参数的值是由为此工作调用Submit()过程返回的job参数的值。
已正在运行的工作不能由调用过程序删除。
7、Run()过程用来立即执行一个指定的工作。
这个过程只接收一个参数:
PROCEDURERun(jobINbinary_ineger)
job参数标识将被立即执行的工作。
8、Submit()过程,工作被正常地计划好。
这个过程有五个参数:
job、what、next_date、interval与no_parse。
PROCEDURESubmit(job OUTbinary_ineger,
What IN varchar2,
next_dateIN date,
interval IN varchar2,
no_parse IN booean:
=FALSE)
job参数是由Submit()过程返回的binary_ineger。
这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
9、User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。
此程序有两个参数:
job与my_call。
PROCEDUREUser_Export(job INbinary_ineger,
my_call INOUTvarchar2)
job参数标识一个安排了的工作。
my_call参数包含在它的当前状态重新提交此工作所需要的正文。
10、What()过程应许在工作执行时重新设置此正在运行的命令。
这个过程接收两个参数:
job与what。
PROCEDUREWhat(job INbinary_ineger,
WhatINOUTvarchar2)
job参数标识一个存在的工作。
what参数指示将被执行的新的PL/SQL代码。
三、查看相关job信息
1、相关视图
dba_jobs
all_jobs
user_jobs
dba_jobs_running包含正在运行job相关信息
2、查看相关信息
SQL>SELECTJOB,NEXT_DATE,NEXT_SEC,FAILURES,BROKEN
SQL>FROMDBA_JOBS;
JOBNEXT_DATENEXT_SECFAILURESB
---------------------------------
912501-JUN-0100:
00:
004N
1414424-OCT-0116:
35:
350N
912701-JUN-0100:
00:
0016Y
3rowsselected.
正在运行的JOB相关信息
SELECTSID,r.JOB,LOG_USER,r.THIS_DATE,r.THIS_SEC
FROMDBA_JOBS_RUNNINGr,DBA_JOBSj
WHEREr.JOB=j.JOB;
SIDJOBLOG_USERTHIS_DATETHIS_SEC
---------------------------------------------
1214144HR24-OCT-9417:
21:
24
258536QS24-OCT-9416:
45:
12
2rowsselected.
JOBQUEUELOCK相关信息
SELECTSID,TYPE,ID1,ID2
FROMV$LOCK
WHERETYPE='JQ';
SIDTYID1ID2
-----------------------------
12JQ014144
1rowselected.
四、简单例子
一个简单例子:
创建测试表
SQL>createtableTEST(adate);
表已创建。
创建一个自定义过程
SQL>createorreplaceprocedureMYPROCas
2 begin
3 insertintoTESTvalues(sysdate);
4 end;
5 /
过程已创建。
创建JOB
SQL>variablejob1number;
SQL>begin
2 dbms_job.submit(:
job1,'MYPROC;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
3 end;
4 /
PL/SQL过程已成功完成。
运行JOB
SQL>begin
2 dbms_job.run(:
job1);
3 end;
4 /
PL/SQL过程已成功完成。
SQL>selectto_char(a,'yyyy/mm/ddhh24:
mi:
ss')时间fromTEST;
时间
-------------------
2001/01/0723:
51:
21
2001/01/0723:
52:
22
2001/01/0723:
53:
24
删除JOB
SQL>begin
2 dbms_job.remove(:
job1);
3 end;
4 /
PL/SQL过程已成功完成.