介绍:
- Oracle Job是Oracle数据库自带的任务调度器,可以在数据库中创建和管理定时任务。
- 它基于PL/SQL语言,允许用户编写存储过程或函数作为任务,并在指定的时间点或时间间隔内自动执行。
- Oracle Job提供了灵活的调度选项,可以设置任务的执行频率、时间点、重复次数等。
优点:
- 可靠性高:Oracle Job是在数据库内部运行的,可以保证任务的可靠性和稳定性。
- 灵活的调度选项:可以根据需求设置任务的执行频率和时间点,满足不同的业务需求。
- 高度可定制化:可以编写复杂的PL/SQL代码作为任务,实现更复杂的业务逻辑。
- 集成性强:Oracle Job与Oracle数据库紧密集成,可以方便地与其他数据库对象进行交互。
缺点:
- 学习成本较高:使用Oracle Job需要掌握PL/SQL语言和相关的调度语法,对于初学者来说可能需要一定的学习成本。
- 依赖于数据库:Oracle Job是依赖于数据库的,如果数据库出现故障或维护,可能会影响任务的执行。
- 缺乏跨平台支持:Oracle Job主要适用于Oracle数据库,对于其他数据库系统可能需要使用不同的调度工具。
使用场景:
- 数据清洗和转换:可以使用Oracle Job定时执行数据清洗和转换任务,保持数据的一致性和准确性。
- 数据备份和恢复:可以使用Oracle Job定时执行数据库备份任务,确保数据的安全性和可恢复性。
- 数据统计和报表生成:可以使用Oracle Job定时执行数据统计和报表生成任务,提供实时的业务数据分析和决策支持。
- 系统维护和优化:可以使用Oracle Job定时执行系统维护和优化任务,如索引重建、统计信息收集等,提高数据库性能和稳定性。
可以满足各种数据库任务的自动化需求,但需要根据具体情况权衡其优缺点并选择合适的使用场景。
--查看定时任务
--ENABLED=FALSE禁用暂定 ENABLED=TRUE启动
select T.ENABLED,T.STATE,T.* from user_scheduler_jobs T;
--查询存储过程
SELECT * FROM user_source WHERE type = 'PROCEDURE' AND name = 'INSERT_JOB_PROC';--存储过程名称
案例:
--创建一个名为t_oracle_job的表
-- job_name:任务名称
-- job_type:任务类型
-- job_status:任务状态
-- create_time:任务创建时间
CREATE TABLE t_oracle_job ( job_name VARCHAR2(100), job_type VARCHAR2(50), job_status VARCHAR2(20), create_time DATE );
在创建定时任务时,各个参数的含义如下:
1. `job_name`:
定时任务的名称,用于唯一标识该任务。
2. `job_type`:
定时任务的类型,指定为 `'PLSQL_BLOCK'` 表示使用 PL/SQL 块作为任务的执行代码。
3. `job_action`:
定时任务的执行代码,可以是一个 PL/SQL 块或一个存储过程的调用。
4. `start_date`:
定时任务的开始时间,指定为 `SYSDATE` 表示使用当前系统时间作为开始时间。
5. `repeat_interval`:
定时任务的重复间隔,指定任务执行的频率和间隔。例如 `'FREQ=MINUTELY; INTERVAL=1'` 表示每隔 1 分钟执行一次任务。
6. `enabled`:
指定定时任务是否启用,`TRUE` 表示启用,`FALSE` 表示禁用。
在 Oracle 数据库中,`job_type` 列用于表示定时任务的类型。以下是一些常见的 `job_type` 类型及其含义:
1. `PLSQL_BLOCK`:表示定时任务是一个 PL/SQL 块。可以在该块中编写自定义的 PL/SQL 代码逻辑,用于执行特定的任务。
2. `STORED_PROCEDURE`:表示定时任务是一个存储过程。可以指定要执行的存储过程名称,定时任务将会调用该存储过程来执行任务。
3. `EXECUTABLE`:表示定时任务是一个可执行文件。可以指定要执行的可执行文件的路径和参数,定时任务将会运行该可执行文件。
4. `CHAIN`:表示定时任务是一个任务链。任务链是一系列相互关联的任务,可以按照指定的顺序依次执行。
5. `SQL_SCRIPT`:表示定时任务是一个 SQL 脚本。可以指定要执行的 SQL 脚本文件的路径,定时任务将会运行该脚本。
这些不同的 `job_type` 类型可以用于不同的场景。例如,`PLSQL_BLOCK` 和 `STORED_PROCEDURE` 可以用于执行自定义的数据库逻辑,`EXECUTABLE` 可以用于执行外部的可执行文件,`CHAIN` 可以用于定义复杂的任务流程,`SQL_SCRIPT` 可以用于执行预定义的 SQL 脚本。
--每1分钟插入一条数据
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'INSERT_JOB', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN INSERT INTO t_oracle_job (job_name, job_type, job_status, create_time) VALUES (''Insert Job'', ''Insert'', ''Pending'', SYSDATE); END;', start_date => SYSDATE, repeat_interval => 'FREQ=MINUTELY; INTERVAL=1', enabled => TRUE ); END;
创建定时任务执行结果
一分钟执行结果:
--修改定时任务3分钟执行一次
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE('INSERT_JOB', 'repeat_interval', 'FREQ=MINUTELY; INTERVAL=3'); END;
--三分钟执行结果
--暂定定时任务
BEGIN DBMS_SCHEDULER.DISABLE('INSERT_JOB'); END;
--启动定时任务
BEGIN DBMS_SCHEDULER.ENABLE('INSERT_JOB'); END;
--删除定时任务
BEGIN DBMS_SCHEDULER.DROP_JOB('INSERT_JOB'); END;
--创建一个存储过程 `INSERT_JOB_PROC`,用于向 `T_ORACLE_JOB` 表中插入数据:
CREATE OR REPLACE PROCEDURE INSERT_JOB_PROC AS BEGIN INSERT INTO T_ORACLE_JOB (JOB_NAME, JOB_TYPE, JOB_STATUS, CREATE_TIME) VALUES ('PROCEDURE Insert Job', 'Insert', 'Pending', SYSDATE); COMMIT; END;
--创建一个定时任务,每分钟执行一次上述存储过程:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'INSERT_JOB_TASK', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN INSERT_JOB_PROC; END;', start_date => SYSDATE, repeat_interval => 'FREQ=MINUTELY; INTERVAL=1', enabled => TRUE ); END;
--创建定时任务INSERT_JOB_TASK执行结果
--定时任务执行存储过程执行结果
--删除存储过程
DROP PROCEDURE INSERT_JOB_PROC;