oracle数据库中job和dbms_job比较

oracle中job和dbms_job比较

一、概述

Oralce中的任务有2种:Job和Dbms_job,两者的区别有:
①、Job是通过调用dbms_scheduler.create_job包创建的,Dbms_job则是通过调用dbms_job.submit包创建的。
②、两种任务的查询视图都分为dba和普通用户的,Job对应的查询视图是dba_scheduler_jobs和user_scheduler_jobs,dbms_jobs对应的查询视图为dba_jobs和user_jobs。
③、在plsql developer中job位于jobs菜单、dbms_job位于dbms_jobs菜单。
在oracle10g以后就推荐采用dbms_scheduler包来取代dbms_job来创建定时任务。

二、使用例子

1、dbms_job的使用
  • 1、语法:
BEGIN
DBMS_JOB.SUBMIT(
   JOB OUT BINARY_INTERGER,--输出变量,是此任务在任务队列中的编号,也可以自定义,一般不传
   WHAT IN VARCHAR2,--执行的任务的名称及其输入参数
   NEXT_DATE IN DATE DEFAULT SYSDATE,--任务执行的时间
   INTERVAL IN VARCHAR2 DEFAULT NULL,--任务执行的时间间隔
   NO_PARSE IN BOOLEAN DEFAULT FALSE,--用于指定是否需要解析与作业相关的过程
   INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,--用于指定哪个例程可以运行作业
   FORCE IN BOOLEAN DEFAULT FALSE--用于指定是否强制运行与作业相关的例程
);
END

例子:

CREATE OR REPLACE PROCEDURE PROC_ADD_TEST AS
BEGIN
  INSERT INTO A8 VALUES (TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI'));/*向测试表插入数据*/
  COMMIT;
END;
---------------------------------------------------------------------
declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT => 'proc_add_test;',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => sysdate+3/(24*60),  /*初次执行时间-下一个3分钟*/  
        INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/
      ); 
  commit;
end;
  • 2、删除job:
    dbms_job.remove(jobno); – jobno任务号

  • 3、修改要执行的操作:
    job:dbms_job.what(jobno, what); --指定任务号以及存储过程

  • 4、修改下次执行时间:
    dbms_job.next_date(jobno, next_date); --指定任务号的时间

  • 5、修改间隔时间:
    dbms_job.interval(jobno, interval); --指定任务号的间隔时间

  • 6、改变与作业相关的所有信息,包括作业操作,作业运行日期以及运行时间间隔等.

dbms_job.change(
  job in binary_integer,
  what in varchar2,
  next_date in date,
  interval in varchar2,
  instance in binary_integer default null,
  force in boolean default false
);
--例子
dbms_job.change(2,null,null,'sysdate+2');
  • 7、启动job:
    dbms_job.run(jobno); --指定任务号启动

  • 8、停止job:
    dbms.broken(jobno, broken, nextdate); –broken为boolean值 N代表启动,Y代表没启动(STOP)

2、job的使用

使用dbms_scheduler创建job需要具有create job权限,对定时任务一些操作需要具有MANAGE SCHEDULER权限,如:dbms_scheduler.stop_job(‘my_job_test’,true)。

--1.创建表
create table bak_job_test(date_time date,mark varchar2(200));
--2.创建一个存储过程,用于创建表
create or replace procedure my_test authid current_user is
       v_count number := 0;
       v_mess varchar2(200) := '';
     begin
      select count(1) into v_count from user_tables t where t.TABLE_NAME = 'BAK_JOB_TABLES';
       if  v_count > 0 then
          execute immediate 'drop table bak_job_tables purge';
       end if;
      execute immediate 'create table bak_job_tables as select * from user_tables where 1=2';
      insert into bak_job_test(date_time,mark) values(sysdate,'success');
exception
when others then
v_mess := substr(SQLERRM,0,200);
insert into bak_job_test(date_time,mark) values(sysdate,v_mess);
      end;
--3.创建存储过程
BEGIN
     dbms_scheduler.create_job(job_name        => 'my_job_test',
                             job_type        => 'STORED_PROCEDURE',
                             job_action      => 'my_test',
                              start_date      => sysdate,
                             repeat_interval => 'sysdate + 1/1440',
                             enabled         => TRUE,
                             comments        => 'test');
END;

你可能感兴趣的:(数据库,oracle)