【原创】创建job实验

                                    oracle job实验
2013/11/18         
一、概述
    job的使用可以大大减少工作量。有时要定时执行任务,就要用到job。
二、操作步骤
--本次实验在SCOTT用户下操作,对scott赋予了DBA的权限!方便后续建表,建job等操作!
1.定义一张表test_stu
create table test_Stu(
   stuno        number   primary key  not null,
   stuname      varchar2(20),
   classno      varchar2(10),
   inrolldate   date
);
--向表中插入数据

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
  update test_stu set inrolldate = inrolldate + 1;
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包介绍

该包包含以下子过程:
-------------------
  Submit()
 Run()
 Broken()
  Remove()
 change()
 What()
  Next_Date()
 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
   dbms_job.broken (:job,false,next_date)
  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设置:
描述                         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)'
--------------------------------------------  
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所需要的正文。
------------------------------------------------------------ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值