`
sangei
  • 浏览: 337295 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Oracle中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的创建方法和使用,希望对大家有帮助。
细节不容错过!

分享到:
评论

相关推荐

    oracleJob创建脚本

    ### Oracle Job 创建脚本详解 ...综上所述,Oracle Job 是一个非常强大的工具,通过合理的配置和使用,可以在数据库管理中发挥重要作用。在实际应用中,还需要结合具体情况灵活运用,不断优化和完善Job的设置。

    oracle 创建job实例

    Oracle 创建 Job 实例是指在 Oracle 数据库中创建一个计划任务,用于在特定的时间点执行特定的操作。以下是创建 Job 实例的详细过程和相关知识点: 一、创建 Job 实例 要创建一个 Job 实例,需要使用 dbms_job....

    ORACLE创建JOB脚本

    本文将深入探讨Oracle中的JOB创建,以及如何编写和使用相应的脚本来设定定时任务。 首先,我们需要理解Oracle中的DBMS_JOB包,这是Oracle提供的一组过程,用于创建、修改和管理JOB。DBMS_JOB包包含以下主要过程: ...

    导出ORACLE - JOB

    从oracle库中导出自定义的job脚本。

    Oracle 创建 job 实例

    例如,可能需要每分钟将一个表中的数据更新到另一个表中,这样的任务可以通过创建 Oracle 的 Job 来实现。 #### 一、准备工作 1. **创建目标表**:首先需要创建一个用于存储定时更新数据的目标表。 ```sql ...

    oracle job创建脚本

    Oracle DBMS_JOB是一个系统包,提供了创建、修改和删除Job的功能。这个包包含了一系列的子程序,如SUBMIT、B broken、ALTER、DELETE等,用于管理Jobs。 2. **变量声明**: 在提供的脚本中,首先声明了一个名为`...

    oracle创建job

    在 Oracle 中,Job 是一个异步执行的任务,可以根据需要设置执行频率和执行时间。本文将详细介绍 Oracle 中创建 Job 的步骤和相关操作。 一、创建 Job 的准备工作 在创建 Job 之前,需要首先创建一个表来存储 Job ...

    Oracle创建job

    oracle Job创建、管理、监控,Job运行情况分析,如果创建、删除、停止、修改Job.

    oracle中JOB总结

    Oracle中的JOB是一个重要的后台机制,用于自动化执行定时任务。这些任务可以是数据库维护、数据清理、备份或者其他任何基于时间的数据库操作。Oracle数据库利用SNP(Scheduler)进程来管理和执行这些JOB。 SNP...

    ORACLE如何停止一个JOB

    ### ORACLE如何停止一个JOB:深入解析与实践 在Oracle数据库管理中,有时我们需要停止正在运行的JOB,这可能是由于各种原因,如发现错误、优化性能或调整资源分配。本文将详细阐述如何在Oracle中查询并停止正在运行...

    oracle_job的创建更改及删除

    "Oracle Job 创建、更改和删除" Oracle Job 是一种自动执行任务的机制,允许数据库管理员创建、...通过上面的介绍,我们可以 thấy,Oracle Job 提供了一个灵活的机制来自动执行任务,提高了数据库管理员的工作效率。

    oracle的job定时

    在Oracle中,创建一个Job主要涉及以下几个步骤: 1. **定义存储过程**:首先,我们需要编写一个存储过程来封装要定时执行的操作。例如,如果要每天创建一个新的表来记录更新的节目信息,我们可以创建一个名为`sp_...

    oracle job 创建

    Oracle Job 是 Oracle 数据库中的一个特性,用于在预定义的时间间隔自动执行数据库任务,例如运行存储过程、PL/SQL 块或者 SQL 查询。对于初学者来说,理解如何创建、运行和管理 Oracle Job 是十分重要的。 1. **...

    Oracle Job的用法

    Oracle Job是Oracle数据库中的一个强大特性,主要用于在特定时间或间隔执行数据库操作,例如数据备份、维护任务或者定期的数据处理。以下是对Oracle Job使用方法和技巧的详细说明: 一、创建Oracle Job Oracle Job...

    创建oracle job

    在这个例子中,我们创建了一个名为`MYJOB`的Job,它将执行名为`MYPRO`的Program,并按照名为`MYSCH`的Schedule执行。 ##### 5. 查看Job的运行情况 为了查看Job是否正常运行,可以执行以下查询: ```sql SELECT ...

    Oracle Job定时任务

    每个 Job 都有一个唯一的标识符 `JOB`,以及其他一些字段,如: * `LOG_USER`: 提交任务的用户。 * `PRIV_USER`: 赋予任务权限的用户。 * `SCHEMA_USER`: 对任务作语法分析的用户模式。 * `LAST_DATE` 和 `LAST_SEC...

    Oracle中job的使用详解

    Oracle 中的 Job 是一个非常强大且灵活的功能,它允许开发者在数据库中执行计划任务,提高数据库的自动化程度和效率。那么,什么是 Oracle 中的 Job 呢? Oracle 中的 Job 是一个计划任务,它可以在指定的时间点或...

    在oracle中创建方案

    详细描述了在oracle中创建方案的3种方法,包括利用图形界面和sql语句

    oracle job

    1. **创建Job**:使用DBMS_SCHEDULER或DBMS_JOB包中的函数创建一个新的作业。例如,可以使用DBMS_SCHEDULER.CREATE_JOB来定义作业的名称、执行的PL/SQL代码、执行频率和开始时间。 ```sql BEGIN DBMS_SCHEDULER....

Global site tag (gtag.js) - Google Analytics