1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > oracle创建job

oracle创建job

时间:2024-04-29 05:56:52

相关推荐

oracle创建job

创建

variablejob_feeid_create NUMBER ;

begin

sys.dbms_job.submit(:job_feeid_create, ' wlk_check_fee; ' ,sysdate, ' TRUNC(SYSDATE+1) ' );

commit ;

end ; 在命令控制台中这样就可以建产一个作业了。sysdate表示当前作业将来执行的时间,sysdate+1表示调用频率。

描述INTERVAL参数值

每天午夜12点 ' TRUNC(SYSDATE+1) '

每天早上8点30分 ' TRUNC(SYSDATE+1)+(8*60+30)/(24*60) '

每星期二中午12点 ' NEXT_DAY(TRUNC(SYSDATE), '' TUESDAY '' )+12/24 '

每个月第一天的午夜12点 ' 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")))+(6×60+10)/(24×60) '

1、每分钟执行

Interval =>TRUNC(sysdate,’mi’) +1/ (24*60)

2、每天定时执行

例如:每天的凌晨2点执行

Interval =>TRUNC(sysdate) +1+2/ (24)

3、每周定时执行

例如:每周一凌晨2点执行

Interval =>TRUNC(next_day(sysdate,2))+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'),12)+2/24

每天午夜12点

'TRUNC(SYSDATE+1)' 每天早上8点30分 'TRUNC(SYSDATE+1)+(8*60+30)/(24*60)'

每星期二中午12点

'NEXT_DAY(TRUNC(SYSDATE),''TUESDAY'')+12/24'

每个月第一天的午夜12点 '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")))+(6×60+10)/(24×60)'

运行

begin

dbms_job.run(:job_feeid_create);

end ;

查询作业记录select * from user_jobs

具体讲解:

1.确保Oracle的工作模式允许启动任务队列管理器

Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以 DBA的身份去执行如下命令:

svrmgrl>; alter system enable restricted session;

或sql>; alter system disenable restricted session;

利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。

2.确保Oracle的系统已经配置了任务队列管理器的启动参数

SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是 initmyora8.ora,在文件中对SNP启动参数的描述部分如下:

job_queue_process=n

job_queue_interval=N

第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。

第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状 态,睡眠一段时间后,由系统的总控负责将其唤醒。

如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的 话,N的配置也要相应地小一点。

3.将任务加入到数据库的任务队列中

用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中:dbms_job.submit(joboutbinary_integer,

what in archar2,

next_date in date,

interval in varchar2 ,

no_parse in boolean)

其中:

●job:输出变量,是此任务在任务队列中的编号;

●what:执行的任务的名称及其输入参数;

●next_date:任务执行的时间;

●interval:任务执行的时间间隔。

下面详细讨论一下dbms_job.submit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null 时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。

将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以 DBA的身份将权利授予scott用户:

svrmgrl>; grant execute on dbms_job to scott;

4.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段

例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令:sql > ;variablen number ;

sql > ; begin

dbms_job.submit(:n‘my_job;’,sysdate,

‘sysdate+ 1 / 360 ’);

commit ;

end ;

/ 系统提示执行成功。Sql > ; print :n; 系统打印此任务的编号,例如结果为300。

如上,我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况:

sql > ; select job,next_date,next_sec,failures,broken from user_jobs; 执行结果如下:

job next_date next_sec failures broken

300 2000/10/10 11:45:15 0 N

这表示任务号为300的任务,下一次将在2000/10/10 11:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_job.broken,重新设置为not broken,或强制调用dbms_job.run来重新执行它。

除了以上我们讨论的submit存储过程之外,Oracle还提供了其他许多存储过程来操作任务。例如:dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务,只需运行dbms_job.remove(n)即可,其中n为任务号。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。