oracle Job 定时任务

简介: oracle Job 定时任务

介绍:

- 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;


相关文章
|
SQL 关系型数据库 Perl
|
SQL Oracle 关系型数据库
|
Oracle 关系型数据库 存储
|
SQL Oracle 关系型数据库
|
Oracle 关系型数据库
【JOB】Oracle JOB全面学习(DBMS_JOB和DBMS_SCHEDULER)
【JOB】Oracle JOB全面学习(DBMS_JOB和DBMS_SCHEDULER)     >>        >                                          ...
884 0
|
SQL Oracle 关系型数据库
Oracle 12c中JOB运行失败的简单处理(r11笔记第66天)
在之前简单分析过一个12c中数据字典的小问题。 Oracle 12c数据字典的小问题(r11笔记第49天) 最近查看邮件,12c的一个PDB还是存在JOB运行异常的情况,因为是测试环境,不是业务类的JOB,这个问题就给了我一些时间来修复。
1624 0
|
Oracle 关系型数据库 数据库
Oracle运行JOB报ORA-27492:无法运行作业
【场景说明】数据库版本:11.2.0.3,创建SCHEDULER JOB,前台运行的时候没有报错,但是设置成后台JOB的时候,就是不会自动运行,且报如下错误 ORA-27492和ORA-06512   【原因分析】当前用户下可以运行,说明JOB本身没有问题;在使用Oracle jobs时,需要关注job_queue_processes参数,该参数用于设定job队列可以启动的进程数,之前有碰到用户由于这个参数设置为0导致JOB不能运行。
1230 0