精通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
```sqlBEGIN
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
```sqlBEGIN
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.按时间点调度
```sqlBEGIN
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:
```sqlBEGIN
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;
/
BEGINDBMS_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状态
```sqlSELECT 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执行情况
```sqlSELECT job_name, current_instance, current_session, elapsed_time, cpu_used FROM dba_scheduler_running_jobs;
使用上述语句可以查询所有正在运行的Job的执行情况信息。
综上所述,Oracle Job是一种非常实用的自动化执行任务机制。本文全面介绍了Oracle Job的创建