`
cqh520llr
  • 浏览: 509981 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

DBMS_JOB 用法

 
阅读更多
在Oracle中可以使用JOB来实现一些任务的自动化执行,类似于UNIX操作系统crontab命令的功能。
简单演示一下,供参考。

1.创建表T,包含一个X字段,定义为日期类型,方便后面的定时任务测试。
sec@ora10g> create table t (x date);

Table created.

2.创建存储过程p_insert_into_t,每次执行该存储过程都会向T表中插入一条系统当前时间。
sec@ora10g> create or replace procedure p_insert_into_t
  2  as
  3  begin
  4     insert into t
  5     values (SYSDATE);
  6  end;
  7  /

Procedure created.

3.OK,准备就绪,我们来创建一个JOB,这个JOB会每分钟运行一次?需要注意一个细节!
sec@ora10g> variable job_number number;
sec@ora10g> begin
  2     DBMS_JOB.submit (:job_number,
  3                      'P_INSERT_INTO_T;',
  4                      SYSDATE,
  5                      'sysdate+1/(24*60)');
  6  end;
  7  /

PL/SQL procedure successfully completed.

4.我们通过USER_JOBS视图查看一下创建的JOB信息。
sec@ora10g> select job,
  2         log_user,
  3         to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
  4         to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
  5         interval,
  6         what
  7    from user_jobs
  8  /

    JOB LOG_USER LAST_DATE           NEXT_DATE           INTERVAL          WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
     27 SEC                          2010-01-29 00:34:20 sysdate+1/(24*60) P_INSERT_INTO_T;

细节之处在此,此处的LAST_DATE内容是空,表示此JOB没有被执行过,因此这个JOB将永远不会被自动的执行。
这一点可以从T表没有数据来得到验证:
sec@ora10g> select * from t;

no rows selected

那么,如何才能使它自动执行起来呢?
很简单,只要我们手动将这个JOB执行一下即可。

5.手工执行JOB一次,使之按照既定的时间间隔执行。
sec@ora10g> execute dbms_job.run(27);

PL/SQL procedure successfully completed.

此时T表中将会被插入一条具有当前时间的数据。
sec@ora10g> select * from t;

X
-------------------
2010-01-29 00:37:42

再次查看JOB的信息
sec@ora10g> select job,
  2         log_user,
  3         to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
  4         to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
  5         interval,
  6         what
  7    from user_jobs
  8  /

    JOB LOG_USER LAST_DATE           NEXT_DATE           INTERVAL          WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
     27 SEC      2010-01-29 00:37:42 2010-01-29 00:38:42 sysdate+1/(24*60) P_INSERT_INTO_T;

此时LAST_DATE显示了我们执行JOB的时间,同时NEXT_DATE显示了下次JOB将被执行的时间。此后这个JOB将会每隔一分钟被执行一次。
自动执行一段时间后的T表内容如下:
sec@ora10g> select * from t order by x;

X
-------------------
2010-01-29 00:37:42
2010-01-29 00:38:46
2010-01-29 00:39:46
2010-01-29 00:40:46
2010-01-29 00:41:46
2010-01-29 00:42:46
2010-01-29 00:43:46
2010-01-29 00:44:46
2010-01-29 00:45:46
2010-01-29 00:46:46
2010-01-29 00:47:46
2010-01-29 00:48:46
2010-01-29 00:49:46
2010-01-29 00:50:46
2010-01-29 00:51:46
2010-01-29 00:52:46

16 rows selected.

6.为什么刚刚创建后的JOB不能自动的执行呢?
这是一个疏忽导致的!
在创建JOB的时候,需要在结尾处指定“COMMIT;”!表示创建完成之后便执行一次。
删除之前的JOB,重新创建一个带有“COMMIT”语句的新JOB。
sec@ora10g> variable job_number number;
sec@ora10g> begin
  2     DBMS_JOB.submit (:job_number,
  3                      'P_INSERT_INTO_T;',
  4                      SYSDATE,
  5                      'sysdate+1/(24*60)');
  6     commit;
  7  end;
  8  /

sec@ora10g> print job_number;

JOB_NUMBER
----------
        29

此次创建的JOB信息如下,可见LAST_DATE在创建完之后便有内容,表示已经被执行了一次。
sec@ora10g> select job,
  2         log_user,
  3         to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
  4         to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,
  5         interval,
  6         what
  7    from user_jobs
  8  /

    JOB LOG_USER LAST_DATE           NEXT_DATE           INTERVAL          WHAT
------- -------- ------------------- ------------------- ----------------- ----------------
     29 SEC      2010-01-29 01:02:11 2010-01-29 01:03:11 sysdate+1/(24*60) P_INSERT_INTO_T;

一分钟过后便可看到T表中已有两条记录。
sec@ora10g> select * from t;

X
-------------------
2010-01-29 01:02:11
2010-01-29 01:03:11

7.删除JOB方法
很简单,使用“dbms_job.remove”即可。
sec@ora10g> execute dbms_job.remove(29);

PL/SQL procedure successfully completed.

8.最后,谈一下创建JOB时用到的参数。
1)使用desc命令查看DBMS_JOB,可以得到SUBMIT这个存储过程的参数列表。
sec@ora10g> desc DBMS_JOB
...
PROCEDURE SUBMIT
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 JOB                            BINARY_INTEGER          OUT
 WHAT                           VARCHAR2                IN
 NEXT_DATE                      DATE                    IN     DEFAULT
 INTERVAL                       VARCHAR2                IN     DEFAULT
 NO_PARSE                       BOOLEAN                 IN     DEFAULT
 INSTANCE                       BINARY_INTEGER          IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT
...

2)如果希望对这些参数有更好的理解,可以参考Oracle的官方文档描述,细致而周到。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_job.htm#sthref2936

3)重点关注一下官方文档中关于INTERVAL参数的示例
'sysdate + 7'表示一周执行一次;
'next_day(sysdate,''TUESDAY'')' 表示每周二执行一次;
'null'表示只执行一次。

本文中我使用的是'sysdate+1/(24*60)'表示每分钟执行一次。很形象,一天的二十四分之一是一小时,一小时的六十分之一就是一分钟的意思。

9.小结
通过这个文章和大家分享了一点关于JOB的创建方法和使用,希望对大家有帮助。
细节不容错过!

转

分享到:
评论

相关推荐

    DBMS_JOB使用方法

    ### DBMS_JOB 使用方法详解 #### 一、概述 `DBMS_JOB` 是 Oracle 数据库提供的用于调度任务的包,可以实现对定时任务的管理,包括任务的创建、修改、删除及执行等操作。该包提供了多种过程和函数,允许用户以灵活...

    DBMS_JOB包创建ORACLE定时任务

    `DBMS_JOB.SUBMIT()`函数是创建一个新作业的主要方法。它接受以下参数: 1. **JOB**:输出变量,返回新创建的作业的唯一标识符。 2. **WHAT**:字符串参数,表示要执行的PL/SQL块或存储过程的名字。这是作业的核心...

    DBMS_JOB定义

    ### DBMS_JOB定义 在Oracle数据库环境中,`DBMS_JOB`是用于管理后台任务调度的强大工具之一。通过`DBMS_JOB`包,用户可以轻松地安排执行特定的PL/SQL块...掌握`DBMS_JOB`的基本用法对于数据库管理员来说是非常重要的。

    oracle数据库定时任务dbms_job的用法详解

    以下是对DBMS_JOB用法的详细说明: 1. 创建Job: 使用DBMS_JOB.SUBMIT函数创建一个新的定时任务。该函数需要提供一个变量来接收任务编号(jobno),存储过程名称(your_procedure),以及任务的下次执行时间和间隔...

    用Oracle的DBMS_JOB来实现任务计划管理.pdf

    使用 Oracle 的 DBMS_JOB 来实现任务计划管理 Oracle 数据库提供了一个功能强大的任务计划管理系统,称为 DBMS_JOB,可以帮助用户实现任务计划管理。在本文中,我们将详细介绍如何使用 Oracle 的 DBMS_JOB 来实现...

    Oracle用RMAN和DBMS_JOB包实现自动存储1

    当数据库被关闭时,被数据库使用的每一个文件都被备份下来。这些文件因而保持着数据关闭时的完整的映象。热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。这涉及到将每个表空间设置为备份...

    Oracle系统包详细使用方法

    本文将详细讲解这些系统包的用途和使用方法。 首先,我们来看dbms_output包,它用于在PL/SQL程序中进行输入和输出。通过enable和disable过程,我们可以开启或关闭输出功能。put_line过程用于打印一行文本,而put...

    JOB排程操作&實例.zip

    本资料包“JOB排程操作&實例.zip”深入讲解了DBMS_JOB包的使用方法,并提供了实例,对于理解与掌握Oracle作业调度具有极大的帮助。 首先,DBMS_JOB包主要包含以下几个关键函数和过程: 1. **DBMS_JOB.BROKEN(job#,...

    oracle job 用法

    - **修改Job**:可以使用`DBMS_JOB.CHANGE`过程修改Job的执行逻辑、下次执行时间和执行间隔。 - **删除Job**:调用`DBMS_JOB.REMOVE`过程可以删除一个Job。 - **暂停与恢复Job**:通过设置Job的状态为Broken可以暂停...

    Oracle JOB 用法小结

    以下是对Oracle JOB用法的详细总结: 首先,为了启用JOB队列,需要设置初始化参数`job_queue_processes`。通过SQL语句`alter system set job_queue_processes=n;`设置该参数,其中`n`代表期望的并发作业数量,最大...

    ORACLE_JOB_.rar_oracle

    使用DBMS_JOB包创建作业,主要涉及三个步骤:声明变量、调用BEGIN...END块执行作业、提交作业。例如: ``` DECLARE job_number NUMBER; BEGIN DBMS_JOB.BEGIN(job => job_number, what => 'your_plsql_block',...

    Oracle数据库恢复管理器及特殊包应用 (1)

    DBMS_JOB包的使用方法包括创建作业、调度作业和监控作业状态。首先,使用DBMS_JOB.BEGIN_JOB创建一个作业,指定要执行的PL/SQL代码或存储过程。接着,通过DBMS_JOB.SCHEDULE_JOB设置作业的执行时间,可以是立即执行...

    oracle定时任务.txt

    #### 一、使用`DBMS_JOB` 在Oracle数据库中,`DBMS_JOB`包提供了一种简单的方式来安排周期性或一次性的工作。以下将详细介绍如何使用`DBMS_JOB`来创建、运行和管理定时任务。 ##### 创建定时任务 ```sql -- 创建...

    Oracle内置包的使用方法.rar

    本文将详细介绍Oracle内置包的使用方法,包括它们的功能、调用方式以及示例应用。 1. **DBMS_UTILITY**: 这个包主要用于数据库的实用功能,如格式化SQL语句(UTL_FMT),获取数据库版本信息,以及执行PL/SQL块等。...

    oracle系统包

    ### Oracle系统包——dbms_job用法详解 Oracle系统包中的`dbms_job`是一个非常重要的功能组件,它主要用于在Oracle数据库中安排和管理后台作业(job),使得数据库能够定期执行特定的任务。这对于自动化数据库管理...

    oracle job 例子

    使用 `DBMS_JOB.RUN(job#)` 可以手动执行 Job,`DBMS_JOB.BROKEN(job#, broken)` 用于禁用 Job,`DBMS_JOB.SUBMIT(job#, 'your_plsql')` 则用于提交新的 PL/SQL 块。 3. **DBMS_SCHEDULER 功能**: - **依赖性管理...

Global site tag (gtag.js) - Google Analytics