共计 3186 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要介绍了 ORACLE 如何创建 jobs,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
一、使用 Jobs
所谓 JOBS,其实就是 Scheduler 管理的一个 (或多个) 任务的执行调度。
1.1 创建 Jobs
通过 DBMS_SCHEDULER 包来创建 Jobs,是使用其 CREATE_JOB 过程。在创建 Job 时,用户可以指定要执行的任务,调度信息 (啥时候执行,执行周期,终止日期等) 以及其它一些任务相关的属性。CREATE_JOB 过程调用还是比较简单的,例如:
SQL BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name = INSERT_TEST_TBL ,
4 job_type = STORED_PROCEDURE ,
5 job_action = P_ INSERT INTOTEST ,
6 start_date = sysdate,
7 repeat_interval = FREQ=DAILY;INTERVAL=1
8 END;
9 /
PL/SQL 过程已成功完成。
事实上,有权限的话,用户也可以创建其它 SCHEMA 下的 JOB,只需要在指定 JOB_NAME 时,按照 schema.job_name 的格式即可。注意哟,这种情况下创建的 JOB,其 CREATED 与 OWNER 有可能并不相同的哟。
当使用 CREATE_JOB 过程创建 JOB 时,可指定的参数值很多,只不过多数情况下用户仅指定部分参数即可满足需求。
其中,上例中指定的参数,分别代表的含义如下:
JOB_NAME:指定任务的名称,必选值,注意要确保指定的名称唯一。
JOB_TYPE:任务执行的操作类型,必选值,有下列几个可选值:
PLSQL_BLOCK:表示任务执行的是一个 PL/SQL 匿名块。
STORED_PROCEDURE:表示任务执行的是 ORACLE 过程(含 PL/SQL PROCEDURE 和 JAVA PROCEDURE),本例中正是指定这一参数值。
EXECUTABLE:表示任务执行的是一个外部程序,比如说操作系统命令。
CHAIN:表示任务执行的是一个 CHAIN。
JOB_ACTION:任务执行的操作,必选值,应与 JOB_TYPE 类型中指定的参数相匹配。
比如说对于 PL/SQL 匿名块,此处就可以放置 PL/SQL 块的具体代表,类似 DECLARE .. BEGIN ..END 这类;如果是 ORACLE 过程,那么此处应该指定具体的过程名,注意由于任务执行,即使过程中有 OUT 之类参数,实际执行时也不会有输出的。
START_DATE:指定任务初次执行的时间,本参数可为空,当为空时,表示任务立刻执行,效果等同于指定该参数值为 SYSDATE。
REPEAT_INTERVAL
:指定任务执行的频率,比如多长时间会被触发再次执行。本参数也可以为空,如果为空的话,就表示当前设定的任务只执行一次。REPEAT_INTERVAL 参数需要好好说说,因为这一参数与标准 JOB 中的 INTERVAL 参数有很大区别,相比之下,REPEAT_INTERVAL 参数的语法结构要复杂的多。其中最重要的是 FREQ 和 INTERVAL 两个关键字。
FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。
INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从 1 -99。
例如:REPEAT_INTERVAL= FREQ=DAILY;INTERVAL=1 表示每天执行一次,如果将 INTERVAL 改为 7 就表示每 7 天执行一次,效果等同于 FREQ=WEEKLY;INTERVAL=1。
一般来说,使用 DBMS_SCHEDULER.CREATE_JOB 创建一个 JOB,至少需要指定上述参数中的前 3 项。除此之外,还可以在 CREATE_JOB 时,指定下列参数:
NUMBER_OF_ARGUMENTS:指定该 JOB 执行时需要附带的参数的数量,默认值为 0,注意当 JOB_TYPE 列值为 PLSQL_BLOCK 或 CHAIN 时,本参数必须设置为 0,因为上述两种情况下不支持附带参数。
END_DATE
:指定任务的过期时间,默认值为 NULL。任务过期后,任务的 STATE 将自动被修改为 COMPLETED,ENABLED 被置为 FALSE。如果该参数设置为空的话,表示该任务永不过期,将一直按照 REPEAT_INTERVAL 参数设置的周期重复执行,直到达到设置的 MAX_RUNS 或 MAX_FAILURES 值。
JOB_CLASS:指定任务关联的 CLASS,默认值为 DEFAULT_JOB_CLASS。关于 JOB CLASS 的信息就关注本系列的后续文章。
ENABLED:指定任务是否启用,默认值为 FALSE。FALSE 状态表示该任务并不会被执行,除非被用户手动调用,或者用户将该任务的状态修改为 TRUE。
AUTO_DROP:当该标志被置为 TRUE 时,ORACLE 会在满足条件时自动删除创建的任务
任务已过期;
任务最大运行次数已达 MAX_RUNS 的设置值;
任务未指定 REPEAT_INTERVAL 参数,仅运行一次;
该参数的默认值即为 TRUE。用户在执行 CREATE_JOB 过程时可以手动将该标志指定为 FALSE,当参数值设置为 FALSE 时,即使满足上述提到的条件任务也不会被自动删除,这种情况下,唯一能够导致任务被删除的情况,就是用户主动调用 DROP_JOB 过程。
COMMENTS:设置任务的注释信息,默认值为 NULL。
上面的例子创建了一个新的 JOB,不过这个 JOB 与普通 JOB 不同,此时查询 USER_JOBS 视图是查不到刚刚创建的 JOB 的信息,因为这个 JOB 是 SCHEDULER 管理的 JOB。要查询 SCHEDULER 管理的 JOS,应该通过 USER_SCHEDULER_JOBS(当然 ALL_SCHEDULER_JOBS 和 DBA_SCHEDULER_JOBS 也可以),例如:
SQL select job_name,job_type,job_action,to_char(start_date, yyyy-mm-dd hh34:mi:ss),repeat_interval,enabled,state from user_scheduler_jobs;
JOB_NAME JOB_TYPE JOB_ACTION TO_CHAR(START_DATE, REPEAT_INTERVAL ENABL STATE
——————– —————- ————————- ——————- —————————— —– —————
INSERT_TEST_TBL STORED_PROCEDURE P_INSERTINTOTEST 2009-07-27 13:46:50 FREQ=DAILY;INTERVAL=1 FALSE DISABLED
不过,细心的盆友可能会发现,JOB 虽然成功创建了,但却并未执行,这是怎么回事?其实原因很简单,还记的前面介绍 CREATE_JOB 过程时提到的 ENABLED 参数吗,当不显式指定时,该参数的默认值为 false,JOB 自然不会运行了。如果遇到这类情形,如何修改呢?
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“ORACLE 如何创建 jobs”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!