精通Oracle Job用法全攻略(oracle job用法)

精通Oracle Job用法:全攻略

Oracle Job是一种自动执行任务的机制,它可以在预定的时间或事件触发时自动执行指定的程序或脚本。使用Oracle Job可以自动化许多重复性的数据库管理任务,提高数据库管理效率和准确性。本文将全面介绍Oracle Job的用法,包括创建、管理、调度和监控。

一、创建Oracle Job

创建Oracle Job可以使用DBMS_SCHEDULER包提供的相关过程和函数。以下是示例代码:

“`sql

–创建一个每天晚上10点执行的job

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => ‘job1’,

job_type => ‘PLSQL_BLOCK’,

job_action => ‘BEGIN

DBMS_OUTPUT.PUT_LINE(”Hello, Oracle job!”);

END;’,

start_date => SYSTIMESTAMP,

repeat_interval => ‘FREQ=DLY;BYHOUR=22’,

end_date => SYSTIMESTAMP + INTERVAL ‘7’ DAY,

enabled => TRUE,

comments => ‘A dly job’);

END;

/


在上面的代码中,使用CREATE_JOB过程创建了一个名为job1的Job,类型为PLSQL_BLOCK,执行的操作是向控制台输出一条信息。Job的启动时间为当前时间,重复间隔为每天晚上10点,结束时间为7天后,启动状态为TRUE(可用)。

二、管理Oracle Job

Oracle Job的管理包括暂停、重新启动、修改、删除等操作。以下是相关代码:

1.暂停Job

```sql
BEGIN
DBMS_SCHEDULER.DISABLE (
name => 'job1',
force => FALSE);
END;
/

在上面的代码中,使用DISABLE过程暂停名为job1的Job。如果Job正在运行并且force为TRUE,则该Job会被强制停止。

2.重启Job

“`sql

BEGIN

DBMS_SCHEDULER.ENABLE (

name => ‘job1’);

END;

/


在上面的代码中,使用ENABLE过程重启名为job1的Job。

3.修改Job

```sql
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'job1',
attribute => 'repeat_interval',
value => 'FREQ=WEEKLY;BYDAY=TUE,THU;BYHOUR=22');
END;
/

在上面的代码中,使用SET_ATTRIBUTE过程将名为job1的Job的重复间隔修改为每周的周二和周四晚上10点执行。

4.删除Job

“`sql

BEGIN

DBMS_SCHEDULER.DROP_JOB (

job_name => ‘job1’);

END;

/


在上面的代码中,使用DROP_JOB过程删除名为job1的Job。

三、调度Oracle Job

Oracle Job可以按照预定的时间间隔、时间点、事件触发等方式调度执行。以下是一些常见的调度方式,以及相关代码:

1.按时间点调度

```sql
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'job2',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
INSERT INTO my_table VALUES (''Hello, Oracle job!'');
END;',
start_date => TO_DATE('2022-01-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS'),
end_date => TO_DATE('2022-01-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS'),
enabled => TRUE,
comments => 'A one-time job');
END;
/

在上面的代码中,使用CREATE_JOB过程创建了一个名为job2的Job,类型为PLSQL_BLOCK,执行的操作是向数据表my_table插入一条信息。Job在2022年1月1日上午10点启动,结束时间为上午11点,启动状态为TRUE(可用)。

2.按时间间隔调度

“`sql

BEGIN

DBMS_SCHEDULER.CREATE_SCHEDULE (

schedule_name => ‘every_30_seconds’,

repeat_interval => ‘FREQ=SECONDLY;INTERVAL=30’);

END;

/

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => ‘job3’,

job_type => ‘PLSQL_BLOCK’,

job_action => ‘BEGIN

INSERT INTO my_table VALUES (”Hello, Oracle job!”);

END;’,

start_date => SYSTIMESTAMP,

repeat_interval => ‘every_30_seconds’,

end_date => NULL,

enabled => TRUE,

comments => ‘A job that runs every 30 seconds’);

END;

/


在上面的代码中,首先使用CREATE_SCHEDULE过程创建了一个名为every_30_seconds的调度,重复间隔为30秒。然后使用CREATE_JOB过程创建了一个名为job3的Job,类型为PLSQL_BLOCK,执行的操作是向数据表my_table插入一条信息。Job的启动时间为当前时间,重复间隔为every_30_seconds(调度名),没有结束时间,启动状态为TRUE(可用)。

3.按事件触发调度

Oracle Job还可以在数据库发生特定事件时触发执行。以下是一些常见的事件,以及相关代码:

①数据库启动时执行Job:

```sql
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'job4',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
INSERT INTO my_table VALUES (''Hello, Oracle job!'');
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'NULL',
end_date => NULL,
enabled => TRUE,
auto_drop => FALSE,
job_class => 'DEFAULT_JOB_CLASS',
comments => 'A Job that runs at instance startup');
END;
/

BEGIN
DBMS_SCHEDULER.CREATE_EVENT_TRIGGER (
event_name => 'STARTUP_EVENT',
queue_spec => 'SYS.STARTUP_QUEUE',
event_condition => NULL,
event_queue_name => NULL,
event_queue_client => NULL,
rule_name => NULL,
comments => 'An event-triggered Job');
END;
/

在上面的代码中,使用CREATE_JOB过程创建了一个名为job4的Job,类型为PLSQL_BLOCK,执行的操作是向数据表my_table插入一条信息。Job在数据库启动时触发执行,没有重复间隔和结束时间,启动状态为TRUE(可用)。使用CREATE_EVENT_TRIGGER过程创建了一个名为STARTUP_EVENT的事件触发器,当数据库启动时,该事件触发Job执行。

②表空间空间不足时执行Job:

“`sql

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => ‘job5’,

job_type => ‘PLSQL_BLOCK’,

job_action => ‘BEGIN

INSERT INTO my_table VALUES (”Hello, Oracle job!”);

END;’,

start_date => SYSTIMESTAMP,

repeat_interval => ‘NULL’,

end_date => NULL,

enabled => TRUE,

auto_drop => FALSE,

job_class => ‘DEFAULT_JOB_CLASS’,

comments => ‘A Job that runs when tablespace space is low’);

END;

/

BEGIN

DBMS_SCHEDULER.CREATE_EVENT_TRIGGER (

event_name => ‘pmon_deadlock_time’,

queue_spec => ‘SYS.DEADLOCK_QUEUE’,

event_condition => ‘ORA$DIAG_DEADLOCK = 314 and ORA$DIAG_CURRENT_BLOCKED_SESSION_COUNT

event_queue_name => NULL,

event_queue_client => NULL,

rule_name => NULL,

comments => ‘An event-triggered Job’);

END;

/


在上面的代码中,使用CREATE_JOB过程创建了一个名为job5的Job,类型为PLSQL_BLOCK,执行的操作是向数据表my_table插入一条信息。Job在表空间空间不足时触发执行,没有重复间隔和结束时间,启动状态为TRUE(可用)。使用CREATE_EVENT_TRIGGER过程创建了一个名为pmon_deadlock_time的事件触发器,当表空间空间不足时,该事件触发Job执行。

四、监控Oracle Job

使用DBMS_SCHEDULER包提供的相关函数可以实时监控Oracle Job的运行情况和执行结果。以下是一些常用的函数,以及相关代码:

1.查询Job状态

```sql
SELECT job_name, state FROM dba_scheduler_jobs;

使用上述语句可以查询所有Job的状态信息。

2.查询Job运行日志

“`sql

SELECT log_date, job_name, status, error# FROM dba_scheduler_job_log;


使用上述语句可以查询所有Job的运行日志信息。

3.查询Job执行情况

```sql
SELECT job_name, current_instance, current_session, elapsed_time, cpu_used FROM dba_scheduler_running_jobs;

使用上述语句可以查询所有正在运行的Job的执行情况信息。

综上所述,Oracle Job是一种非常实用的自动化执行任务机制。本文全面介绍了Oracle Job的创建


数据运维技术 » 精通Oracle Job用法全攻略(oracle job用法)