首页 Oracle中job的使用详解

Oracle中job的使用详解

举报
开通vip

Oracle中job的使用详解本文档提供了两篇关于Oraclejob的文章,来源于网上,版权属于原作者,仅供学习参考。Oracle中job的使用详解我们在项目开发中,常常会有一些复杂的业务逻辑。使用oracle的存储过程,可以大大减少java程序代码的编写工作量,而且存储过程执行在数据库上这样可以利用oracle的良好性能支持,极大地提高程序执行效率和稳定性。定时执行存储过程,就要用到job。以下是常用的参数说明:字段(列)JOBLOG_USERPRIV_USERSCHEMA_USERLAST_DATELAST_SEC类型描述NUMBE...

Oracle中job的使用详解
本文档提供了两篇关于Oraclejob的文章,来源于网上,版权属于原作者,仅供学习参考。Oracle中job的使用详解我们在项目开发中,常常会有一些复杂的业务逻辑。使用oracle的存储过程,可以大大减少java程序代码的编写工作量,而且存储过程执行在数据库上这样可以利用oracle的良好性能支持,极大地提高程序执行效率和稳定性。定时执行存储过程,就要用到job。以下是常用的参数说明:字段(列)JOBLOG_USERPRIV_USERSCHEMA_USERLAST_DATELAST_SEC类型描述NUMBER任务的唯一标示号VARCHAR2(30)提交任务的用户VARCHAR2(30)赋予任务权限的用户VARCHAR2(30)对任务作语法分析的用户模式DATE最后一次成功运行任务的时间VARCHAR2(8)如HH24:MM:SS格式的last_date日期的小时,分钟和秒THIS_DATEDATE正在运行任务的开始时间,如果没有运行任务则为nullTHIS_SECVARCHAR2(8)女口HH24:MM:SS格式的this_date日期的小时,分钟和秒NEXT_DATENEXT_SECTOTAL_TIMEBROKENDATE下一次定时运行任务的时间VARCHAR2(8)如HH24:MM:SS格式的next_date日期的小时,分钟和秒NUMBER该任务运行所需要的总时间,单位为秒VARCHAR2(1)标志参数,Y标示任务中断,以后不会运行INTERVALVARCHAR2(200)用于计算下一运行时间的 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式FAILURESNUMBER任务运行连续没有成功的次数WHATVARCHAR2(2000)CURRENT_SESSION_LABELRAWCLEARANCE_HIRAWMLSLABELCLEARANCE_LORAWNLS_ENVVARCHAR2(2000)MISC_ENVRAW(32)执行任务的PL/SQL块MLSLABEL该任务的信任Oracle会话符该任务可信任的Oracle最大间隙MLSLABEL该任务可信任的Oracle最小间隙任务运行的NLS会话设置任务运行的其他一些会话参数描述每天午夜12点每天早上8点30分每星期二中午12点每个月第一天的午夜12点INTERVAL参数值'TRUNC(SYSDATE+1)''TRUNC(SYSDATE+1)+(8*60+30)/(24*60)''NEXT_DAY(TRUNC(SYSDATE),''TUESDAY'')+12/24''TRUNC(LAST_DAY(SYSDATE)+1)'每个季度最后一天的晚上11点'TRUNC(ADD_MONTHS(SYSDATE+2/24,3),'Q')-1/24'每星期六和日早上6点10分’TRUNC(LEAST(NEXT_DAY(SYSDATE,''SATURDAY"),NEXT_DAY(SYSDATE,"SUNDAY")))+(6X60+10)/(24X60)'、设置初始化参数job_queue_processessql>altersystemsetjob_queue_processes=n;(n>0)job_queue_processes最大值为1000查看jobqueue后台进程sql>selectname,descriptionfromv$bgprocess;二,dbms_jobpackage用法介绍包含以下子过程:Broken。过程。change。过程。Interval。过程。Isubmit()过程。Next_Date()过程。Remove。过程。Run()过程。Submit()过程。User_Export()过程。What()过程。1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job、broken与next_date。PROCEDUREBroken(jobINbinary_integer,BrokenINboolean,next_dateINdate:=SYSDATE)job参数是工作号,它在问题中唯一标识工作。broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。bitsCN.Comnextdate参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。job如果由于某种原因未能成功之行,oracle将重试16次后,还未能成功执行,将被标记为broken重新启动状态为broken的job,有如下两种方式;a、利用dbms_job.run()立即执行该jobsql>beginsql>dbms_job.run(:jobno)该jobno为submit过程提交时返回的jobnumbersql>end;sql>/b、利用dbms_job.broken()重新将broken标记为falsesql>beginsql>dbms_job.broken(:job,false,next_date)sql>end;sql>/2、Change()过程用来改变指定工作的设置。这个过程有四个参数:job、what、next_date与interval。PROCEDUREChange(jobINbinary_integer,Whatnext_dateintervalINvarchar2,INdate,INvarchar2)此job参数是一个整数值,它唯一标识此工作。What参数是由此工作运行的一块PL/SQL代码块。next_date参数指示何时此工作将被执行。interval参数指示一个工作重执行的频度。中国.网管联盟3、Interval。过程用来显式地设置重执行一个工作之间的时间间隔数。这个过程有两个参数:job与interval0PROCEDUREInterval(jobINbinary_integer,IntervalINvarchar2)job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。4、ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDUREISubmit(jobINbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=FALSE)这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。5、Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:job与next_date。PROCEDURENext_Date(jobINbinary_ineger,next_dateINdate)bitscn.comjob标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。6、Remove。过程来删除一个已 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 运行的工作。这个过程接收一个参数:PROCEDURERemove(jobINbinary_ineger);7、Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:PROCEDURERun(jobINbinary_ineger)job参数标识将被立即执行的工作。8、使用Submit()过程,工作被正常地计划好。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDURESubmit(jobOUTbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=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(jobINbinary_ineger,my_callINOUTvarchar2)job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。10、What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。PROCEDUREWhat(jobINbinary_ineger,WhatINOUTvarchar2)job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。三、查看相关job信息1、相关视图dba_jobsall_jobsuser_jobsdba_jobs_running包含正在运行job相关信息www_bitscn_comSQL>SELECTJOB,NEXT_DATE,NEXT_SEC,FAILURES,BROKENSQL>FROMDBA_JOBS;JOBNEXT_DATENEXT_SECFAILURESB912501-JUN-0100:00:004N1414424-OCT-Ol16:35:350N912701-JUN-0100:00:0016Yrowsselected.正在运行的JOB相关信息SELECTSID,r.JOB,LOG_USER,r.THIS_DAB,r.THIS_SECFROMDBA_JOBS_RUNNINGr,DBA_JOBSjWHEREr.JOB二j.JOE;SIDJOBLOG_USERTHIS_DATETHIS_SEC1214144HR24-OCT-9417:21:24258536QS24-OCT-9416:45:12rowsselected.JOBQUEUELOCK相关信息SELECTSID,TYPE,ID1,ID2FROMV$LOCKWHERETYPE='JQ';SIDTYID1ID212JQO14144rowselected.四、简单例子一个简单例子:中国网管联盟创建测试表SQL>createtableTEST(adate);表已创建。创建一个自定义过程SQL>createorreplaceprocedureMYPROCasbegininsertintoTESTvalues(sysdate);end;/过程已创建。创建JOBSQL>variablejob1number;SQL>SQL>begindbmsjob.submit(:jobl,'MYPROC;',sysdate,'sysdate+l/1440');end;/PL/SQL过程已成功完成。运行JOBSQL>begindbms」ob.run(:job1);end;/PL/SQL过程已成功完成。SQL>selectto_char(a,'yyyy/mm/ddhh24:mi:ss')时间fromTEST;时间2001/01/0723:51:212001/01/0723:52:222001/01/0723:53:24--每天1440分钟,即一分钟运行test过程一次删除JOBSQL>begindbms_job.remove(:job1);3end;end;/bitsCN_comPL/SQL过程已成功完成。一、Oracle定时器(Job)各时间段写法汇总对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作。但是,Oracle定时器Job时间的处理上,千变万化,今天我把比较常用写法汇总如下:在 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 之前,先把Job的参数说明一下:job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;what参数是将被执行的PL/SQL代码块;next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值;interval参数何时这个工作将被重执行。其中Interval这个值是决定Job何时,被重新执行的关键。例如:有存储过程p_dosomethings,需要被不同的时间间隔执行。declarejobnonumber;begindbms_job.submit(jobno,'p_dosomething;',一whatto_date('20090101020000',‘yyyy-mm-ddhh24:mi:ss'),--next_date,可以不填'Interval时间字符串’--interval,关键设置);commit;end;121、每分钟执行Interval=>TRUNC(sysdate,'mi')+1/(24*60)2、每天定时执行例如:每天的凌晨2点执行Interval=>TRUNC(sysdate)+1+2/(24)3、每周定时执行例如:每周一凌晨2点执行Interval二〉TRUNC(next_day(sysdate,'星期一'))+2/244、每月定时执行例如:每月1日凌晨2点执行Interval=>trunc(LAST_DAY(SYSDATE))+1+2/245、每季度定时执行例如每季度的第一天凌晨2点执行Interval=>TRUNC(ADD_MONTHS(SYSDATE,3)Q')+2/246、每半年定时执行例如:每年7月1日和1月1日凌晨2点Interval二〉ADD_MONTHS(trunc(sysdate,'yyyy5),6)+2/247、每年定时执行例如:每年1月1日凌晨2点执行二、oraclejob下午mumu问我,如何终止一个正在执行的job,我当时也没有想起来(或者说,以前都是run,而没有romove过),所以就上网找了一下,感觉下面写的还不错,就收了起来,呵呵~~~~ORACLE中JOB的应用1、创建存储过程createorreplaceprocedure*pro_nameasbegininsertintoagri_exhibition_basecur(messid,title,type,pub_date)selectid,title,sort,pub_datefromagri_messagewhere(trunc(sysdate-pub_date)=0andrownum<6)andsort二'供';insertintoagri_exhibition_basecur(messid,title,type,pub_date)selectid,title,sort,pub_datefromagri_messagewhere(trunc(sysdate-pub_date)=0andrownum<6)andsort='求';end;/2、创建JOBvariablejobdxmnumber;begindbms_job.submit(:jobdxm,'exhi_pro_dxm;',sysdate,'trunc(sysdate,''dd'')+32.5/24');end;一个简单的JOB实列1、创建测试表SQL>createtablea(adate);表已创建。2、创建一个自定义过程SQL>createorreplaceproceduretestasbegininsertintoavalues(sysdate);end;/过程已创建。3、创建JOBSQL>variablejob1number;SQL>SQL>begindbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次end;/PL/SQL过程已成功完成。4、运行JOBSQL>begindbms_job.run(:jobl):end;/PL/SQL过程已成功完成。SQL>selectto_char(a,5yyyy/mm/ddhh24:mi:ss')时间froma时间2001/01/0723:51:212001/01/0723:52:222001/01/0723:53:245、删除JOBSQL>begindbms_job.remove(:jobl):end;/PL/SQL过程已成功完成。6、一些必要的参数修改initsid.ora参数job_queue_processes=4job_queue_interval=10job_queue_keep_connections二true修改可执行作业个数为20个ALTERSYSTEMSETJOB_QUEUE_PROCESSES=20修改取消限制模式ALTERSYSTEMDISABLERESTRICTEDSESSION;7、两个必要的表user_jobs及dba_jobs_running8、相关的几个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.broken(job,broken,nextdate);启动job:dbms_job.run(jobno);三、OracleJOB用法小结一、设置初始化参数job_queue_processessql>altersystemsetjob_queue_processes=n;(n>0)job_queue_processes最大值为1000查看jobqueue后台进程sql>selectname,descriptionfromv$bgprocess;二,dbms_jobpackage用法介绍包含以下子过程:Broken。过程。change。过程。Interval。过程。Isubmit()过程。Next_Date()过程。Remove。过程。Run()过程。Submit()过程。User_Export()过程。What()过程。1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job、broken与next_date。PROCEDUREBroken(jobINbinary_integer,BrokenINboolean,next_dateINdate:=SYSDATE)job参数是工作号,它在问题中唯一标识工作。broken参数指示此工作是否将标记为破一一TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。job如果由于某种原因未能成功之行,oracle将重试16次后,还未能成功执行,将被标记为broken重新启动状态为broken的job,有如下两种方式;a、利用dbms_job.run()立即执行该jobsql>beginsql>dbms_job.run(:jobno)该jobno为submit过程提交时返回的jobnumbersql>end;sql>/b、利用dbms_job.broken()重新将broken标记为falsesql>beginsql>dbms_job.broken(:job,false,next_date)sql>end;sql>/2、Change()过程用来改变指定工作的设置。这个过程有四个参数:job、what、next_date与interval。PROCEDUREChange(jobINbinary_integer,Whatnext_dateintervalINvarchar2,INdate,INvarchar2)此job参数是一个整数值,它唯一标识此工作。What参数是由此工作运行的一块PL/SQL代码块next_date参数指示何时此工作将被执行。interval参数指示一个工作重执行的频度。3、Interval。过程用来显式地设置重执行一个工作之间的时间间隔数。这个过程有两个参数:job与interval0PROCEDUREInterval(jobINbinary_integer,IntervalINvarchar2)job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。4、ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDUREISubmit(jobINbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=FALSE)这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。5、Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:job与next_date。PROCEDURENext_Date(jobINbinary_ineger,next_dateINdate)网管联盟bitsCN_comjob标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。6、Remove。过程来删除一个已计划运行的工作。这个过程接收一个参数:PROCEDURERemove(jobINbinary_ineger);7、Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:PROCEDURERun(jobINbinary_ineger)job参数标识将被立即执行的工作。8、使用Submit()过程,工作被正常地计划好。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDURESubmit(jobOUTbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=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(jobINbinary_ineger,my_callINOUTvarchar2)job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。10、What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。PROCEDUREWhat(jobINbinary_ineger,WhatINOUTvarchar2)job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。三、查看相关job信息1、相关视图dba_jobsall_jobsuser_jobsdba_jobs_running包含正在运行job相关信息2、查看相关信息SQL>SELECTJOB,NEXT_DATE,NEXT_SEC,FAILURES,BROKENSQL>FROMDBA_JOBS;JOBNEXT_DATENEXT_SECFAILURESB912501-JUN-0100:00:004N1414424-OCT-Ol16:35:350N912701-JUN-0100:00:0016Yrowsselected.正在运行的JOB相关信息SELECTSID,r.JOB,LOG_USER,r.THIS_DAB,r.THIS_SECFROMDBA_JOBS_RUNNINGr,DBA_JOBSjWHEREr.JOB二j.JOE;SIDJOBLOG_USERTHIS_DATETHIS_SEC1214144HR24-OCT-9417:21:24258536QS24-OCT-9416:45:122rowsselected.JOBQUEUELOCK相关信息SELECTSID,TYPE,ID1,ID2FROMV$LOCKWHERETYPE二'JQ';SIDTYID1ID212JQO14144rowselected.四、简单例子一个简单例子:网管下载dl.bitscn.com创建测试表SQL>createtableTEST(adate);表已创建。创建一个自定义过程SQL>createorreplaceprocedureMYPROCasbegininsertintoTESTvalues(sysdate);end;/过程已创建。创建JOBSQL>variablejob1number;SQL>SQL>begindbmsjob.submit(:jobl,'MYPROC;',sysdate/sysdate1/1440');--每天1440分钟,即一分钟运行test过程一次end;/PL/SQL过程已成功完成。运行JOBSQL>begindbms」ob.run(:job1);end;/PL/SQL过程已成功完成。SQL>selectto_char(a,'yyyy/mm/ddhh24:mi:ss')时间fromTEST;时间2001/01/0723:51:212001/01/0723:52:222001/01/0723:53:24删除JOBSQL>begindbms」ob.remove(:jobl);end;/网管bitscn_comPL/SQL过程已成功完成。三、JOB――•工指定Oracle中job执行的时间间隔一、JOB时间间隔的问题我们MIS系统中需要建立一些JOB,比如客户会要求在月底自动生成一些报表统计信息。在指定JOB的执行时间时,一般我们会选择在每月月底的午夜来执行(或者有多个JOB,应该分散在不同的时间段来执行)。此时不能直接用sysdate来确定时间,因为每次执行后,oracle自动生成的下一次的执行时间,会有几秒的延迟。比如,我指定第一次执行时间为:2008-03-2710:58:01,时间间隔的方式为:last_day(add_months(sysdate,1))。那么,JOB执行后我会发现,第一次的执行时间是2008-03-2710:58:05,而下一次的执行时间被更新为2008-04-3010:58:05;而下次执行后,发现它的执行时间是2008-04-3010:58:07,而它再次执行的时间变为2008-05-3110:58:07;„„二、可能原因JOB的调用有时间延迟。我指定在10:58:01执行,可是由于延迟,真正执行的时间是10:58:05;根据实际的执行时间来自动计算下一次的执行时间。我指定下一次的时间计算方法是last_day(add_months(sysdate,1))。但它是根据10:58:05来计算的,而不是10:58:01。三、解决办法这种延迟累计起来,就可能导致执行时间错误!为避免这种延迟,我们应该手工指定执行时间中的“时分秒”。比如,每月月底的午夜:last_day(add_months(to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd'),1))每月的任意指定时间:last_day(add_months(to_date(to_char(sysdate,'yyyy-mm-dd')||'11:24:31','yyyy-mm-ddhh24:mi:ss'),1))这样,每次执行的时间大概会比指定的时间延迟2-5秒,但oracle自动计算出来的下一次执行时间是没有问题的,所以不会累计这个延迟。四、相关测试下面是一个小测试:SQL>conntianyc/test已连接。SQL>select*fromv$version;BANNEROracle9iEnterpriseEditionRelease9.2.0.1.0-ProductionPL/SQLRelease9.2.0.1.0-ProductionCORE9.2.0.1.0ProductionTNSfor32-bitWindows:Version9.2.0.1.0-ProductionNLSRTLVersion9.2.0.1.0-Production--1.创建初始环境—1.1创建表test_job,存放执行日期SQL>createtabletest_job(adate);表已创建。--1.2创建过程,向表test_job中插入执行时的日期SQL>CREATEORREPLACEPROCEDUREPRC_TEST_JOB(PRM_AINDATE,2PRM_APPCODEOUTNUMBER,3PRM_ERRORMSGOUTVARCHAR2)ISBEGINPRM_APPCODE:=1;PRM_ERRORMSG:='succeed';INSERTINTOtest_jobVALUES(prm_a);COMMIT;SQL>SQL>234567891011commit;ENDPRC_TEST_JOB;1112/过程已创建。--2.创建任务--2.1查看当前时间,用来确定创建的任务的执行时间SQL>selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;TO_CHAR(SYSDATE,'YY2008-03-2710:52:20--2.2创建任务,调用步骤1.2中创建的过程。在10:58:01时执行。variablexnumber;beginsys.dbms_job.submit(job=>:x,what=>'DECLAREn_appcodeNUMBER(10);v_errormsgVARCHAR2(4000);BEGINprc_test_job(SYSDATE,n_appcode,v_errormsg);END;',next_date=>to_date('27-03-200810:58:01','dd-mm-yyyyhh24:mi:ss'),interval=>'last_day(add_months(sysdate,1))');12end;13/PL/SQL过程已成功完成。--3.验证数据--3.1在该执行时间之前没有数据SQL>select*fromtest_job;未选定行SQL>selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;TO_CHAR(SYSDATE,'YY2008-03-2710:57:46--3.2过了该时间后,可以查询到数据SQL>selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;TO_CHAR(SYSDATE,'YY2008-03-2710:58:18SQL>selectto_char(a,'yyyy-mm-ddhh24:mi:ss')fromtest_job;TO_CHAR(A,'YYYY-MM-2008-03-2710:58:05—3.3任务执行完毕后,自动根据条件(INTERVAL)更新下次的执行时间(NEXT_DATE)SQL>selectPRIV_USER,LAST_DATE,NEXT_DATE,INTERVALfromuser_jobs;PRIV_USERLAST_DATENEXT_DATEINTERVALTIANYC27-3月-0830-4月-08last_day(add_months(sysdate,1))SQL>selectwhatfromuser_jobs;WHATDECLAREn_appcodeNUMBER(10);v_errormsgVARCHAR2(4000);BEGINprc_test_job(SYSDATE,n_appcode,v_errormsg);END;SQL>--4.存在问题:--4.1test_job里的执行时间不是10:58:01,而是10:58:05:SQL>selectto_char(a,'yyyy-mm-ddhh24:mi:ss')fromtest_job;TO_CHAR(A,'YYYY-MM-2008-03-2710:58:05--4.2在视图user_jobs里也是如此。把这两个时间精确到秒,看看效果:SQL>selectPRIV_USER,to_char(LAST_DATE,'yyyy-mm-ddhh24:mi:ss'),2to_char(NEXT_DATE,'yyyy-mm-ddhh24:mi:ss'),INTERVALfromuser_jobs;PRIV_USERTO_CHAR(LAST_DATE,'TO_CHAR(NEXT_DATE,'INTERVALTIANYC2008-03-2710:58:052008-04-3010:58:05last_day(add_months(sysdate,1))SQL>--4.3经过多次测试,每次执行时并不是按照上次指定的秒执行的,而是滞后几秒。这样累计起来,就可能导致执行日期的错误—所以要想每次都精确地按照秒来执行job,应该手工来指定时间。比如:--4.3.1在每个月的月底的午夜执行SQL>selectto_char(last_day(add_months(to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd'),1)),'yyyy-mm-ddhh24:mi:ss')fromdual;TO_CHAR(LAST_DAY(AD2008-04-3000:00:00--4.3.2在每个月的月底的任意指定时间执行(这里我指定时间为11:24:31)SQL>selectto_char(last_day(add_months(to_date(to_char(sysdate,'yyyy-mm-dd')||'11:24:31','yyyy-mm-ddhh24:mi:ss'),1)),'yyyy-mm-ddhh24:mi:ss')fromdual;TO_CHAR(LAST_DAY(AD2008-04-3011:24:31SQL>一、关于OracleJob语法和时间间隔的设定关于OracleJob语法和时间间隔的设定sys.dbms_job.submit(job=>:job,what=>'P_CLEAR_PACKBAL;',next_date=>to_date('24-04-200805:44:09','dd-mm-yyyyhh24:mi:ss'),interval=>'sysdate+1/360');commit;end;/1:每分钟执行Interval=>TRUNC(sysdate,'mi')+1/(24*60)2:每天定时执行例如:每天的凌晨1点执行Interval=>TRUNC(sysdate)+1+1/(24)3:每周定时执行例如:每周一凌晨1点执行Interval=>TRUNC(next_day(sysdate,5星期一5))+1/244:每月定时执行例如:每月1日凌晨1点执行Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/245:每季度定时执行例如每季度的第一天凌晨1点执行Interval=>TRUNC(ADD_MONTHS(SYSDATE,3)Q')+1/246:每半年定时执行例如:每年7月1日和1月1日凌晨1点Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/247:每年定时执行例如:每年1月1日凌晨1点执行Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24一、OracleJob语法和时间间隔的设定(转)一、初始化相关参数job_queue_processesaltersystemsetjob_queue_processes=39scope二spfile;//最大值不能超过1000;job_queue_interval=10//调度作业刷新频率秒为单位job_queue_process表示oracle能够并发的job的数量,可以通过语句showparameterjob_queue_process;来查看oracle中job_queue_process的值。当job_queue_process值为0时表示全部停止oracle的job,可以通过语句ALTERSYSTEMSETjob_queue_processes=10;来调整启动oracle的job。相关视图dba_jobsall_jobsuser_jobsdba_jobs_running包含正在运行job相关信息提交job语法:beginsys.dbms_job.submit(job=>:job,what=>'P_CLEAR_PACKBAL;',next_date=>to_date('04-08-200805:44:09','dd-mm-yyyyhh24:mi:ss'),interval=>'sysdate+1/360');commit;end;/创建JOBvariablejobnonumber;begindbms_job.submit(:jobno,'P_CRED_PLAN;',SYSDATE,'SYSDATE+1/2880',TRUE);commit;运行JOBSQL>begindbms_job.run(:job1);end;/删除JOBSQL>begindbms_job.remove(:job1);end;/DBA_JOBS字段(列)类型描述JOBNUMBER任务的唯一标示号LOG_USERVARCHAR2(30)提交任务的用户PRIV_USERVARCHAR2(30)赋予任务权限的用户SCHEMA_USERVARCHAR2(30)对任务作语法分析的用户模式LAST_DATEDATE最后一次成功运行任务的时间LAST_SECVARCHAR2(8)如HH24:MM:SS格式的last_date日期的小时,分钟和秒THIS_DATEDATE正在运行任务的开始时间,如果没有运行任务则为nullTHIS_SECVARCHAR2(8)如HH24:MM:SS格式的this_date日期的小时,分钟和秒NEXT_DATEDATE下一次定时运行任务的时间NEXT_SECVARCHAR2(8)如HH24:MM:SS格式的next_date日期的小时,分钟和秒TOTAL_TIMENUMBER该任务运行所需要的总时间,单位为秒BROKENVARCHAR2(1)标志参数,Y标示任务中断,以后不会运行INTERVALVARCHAR2(200)用于计算下一运行时间的表达式FAILURESNUMBER任务运行连续没有成功的次数WHATVARCHAR2(2000)执行任务的PL/SQL块CLEARANCE_HIRAWMLSLABELCLEARANCE_LORAWNLS_ENVVARCHAR2(2000)MISC_ENVRAW(32)CURRENT_SESSION_LABELRAWMLSLABEL该任务的信任Oracle会话符该任务可信任的Oracle最大间隙描述每天午夜12点每天早上8点30分每星期二中午12点每个月第一天的午夜12点MLSLABEL该任务可信任的Oracle最小间隙任务运行的NLS会话设置任务运行的其他一些会话参数INTERVAL参数值'TRUNC(SYSDATE+1)''TRUNC(SYSDATE+1)+(8*60+30)/(24*60)''NEXT_DAY(TRUNC(SYSDATE),''TUESDAY'')+12/24''TRUNC(LAST_DAY(SYSDATE)+1)'每个季度最后一天的晚上11点'TRUNC(ADD_MONTHS(SYSDATE+2/24,3),'Q')-1/24'每星期六和日早上6点10分'TRUNC(LEAST(NEXT_DAY(SYSDATE,''SATURDAY"),NEXT_DAY(SYSDATE,"SUNDAY")))+(6X60+10)/(24X60)'1:每分钟执行Interval=>TRUNC(sysdate,5mi5)+1/(24*60)2:每天定时执行例如:每天的凌晨1点执行Interval=>TRUNC(sysdate)+1+1/(24)3:每周定时执行例如:每周一凌晨1点执行Interval=>TRUNC(next_day(sysdate,5星期一5))+1/244:每月定时执行例如:每月1日凌晨1点执行Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/245:每季度定时执行例如每季度的第一天凌晨1点执行Interval=>TRUNC(ADD_MONTHS(SYSDATE,3)Q')+1/246:每半年定时执行例如:每年7月1日和1月1日凌晨1点Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/247:每年定时执行例如:每年1月1日凌晨1点执行Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24一、oracle中建立job定期运行存储过程总结首先查看SQL>showparameterjobNAMETYPEVALUEjob_queue_processesinteger10如果值是0需要修改(如果为0则无法运行job,此值为允许同时运行的job数量)altersystemsetjob_queue_processes=10;--或者其他值一个简单例子:创建测试表SQL>createtableTEST(adate);表已创建。创建一个自定义过程SQL>createorreplaceprocedureMYPROCasbegininsertintoTESTvalues(sysdate);end;5/过程已创建。创建JOBSQL>variablejob1number;SQL>SQL>begindbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次end;4/PL/SQL过程已成功完成。运行JOBSQL>begin2dbms_job.run(:job1);end;4/PL/SQL过程已成功完成。SQL>selectto_char(a,'yyyy/mm/ddhh24:mi:ss')时间fromTEST;时间2001/01/0723:51:212001/01/0723:52:222001/01/0723:53:24删除JOBSQL>begin2dbms_job.remove(:job1);3end;4/PL/SQL过程已成功完成。Sql>print:n;系统打印此任务的编号,例如结果为300。如上,我们创建了一个每隔1分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况:sql>selectjob,next_date,next_sec,failures,brokenfromuser_jobs;执行结果如下:jobnext_datenext_secfailuresbroken3002000/10/1011:45:150N这表示任务号为300的任务,下一次将在2000/10/1011:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_job.broken,重新设置为notbroken,或强制调用dbms_job.run来重新执行它。除了以上我们讨论的submit存储过程之外‘Oracle还提供了其他许多存储过程来操作任务。例如:dbms_job.change、dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务,只需运行dbms_job.remove(n)即可,其中n为任务号。3上面的例子没有涉及到存储过程带参数的问题,如果带参数假设为MYPROC(inaINVARCHAR2,以下为必须输出参数组outaOUTNUMBER,outbOUTVARCHAR2)则在建立job的代码中创建JOBbeginsys.dbms_job.submit(job=>:job,what=>'declareoutanumber;--定义输出变量outbvarchar2(40);beginMYPROC(''输入'',outa=>outa,outb=>outb);end;',next_date=>to_date('10-10-200608:48:34','dd-mm-yyyyhh24:mi:ss'),interval=>'sysdate+1');commit;end;/、oracle中job的用法一个简单例子:(来源:HYPERLINK"http://topic.csdn.net/t/20051025/15/4349171.html"http://topic.csdn.net/t/20051025/15/4349171.html)创建测试表SQL>createtablea(adate);表已创建。创建一个自定义过程SQL>createorreplaceproceduretestas2begin3insertintoavalues(sysdate);4end;5/过程已创建。创建JOBSQL>variablejob1number;SQL>SQL>begin一次2dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程3end;/PL/SQL过程已成功完成。运行JOBSQL>begin2dbms_job.run(:job1);3end;/PL/SQL过程已成功完成。SQL>selectto_char(a,'yyyy/mm/ddhh24:mi:ss')时间froma;时间2001/01/072001/01/0723:51:2123:52:22删除JOBSQL>234begindbms_job.remove(:job1);end;/PL/SQL过程已成功完成。selectjob,to_char(next_date,'yyyy-mm-ddhh24:mi:ss')fromall_jobs;2001/01/0723:53:24job的使用:DBMS_JOB.SUBMIT(:jobno,//job号'your_procedure;',//要执行的过程trunc(sysdate)+l/24,//下次执
本文档为【Oracle中job的使用详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_997338
暂无简介~
格式:doc
大小:62KB
软件:Word
页数:54
分类:
上传时间:2020-07-18
浏览量:8