利用Oracle触发器实现数据库自动任务处理(oracle触发器类型)
Oracle触发器可以帮助开发者轻松实现定时任务,简化对动态数据表或表之间关联的复杂性,实现数据库自动任务处理,从而大大提高存储过程的执行效率。
Oracle触发器实现数据库自动任务处理的过程主要分为三步:
1. 创建表
首先,需要创建一个表,此表将存放当触发器被触发时要执行的 SQL 语句。 如下例所示,表中的每一行对应一条待执行的 SQL 语句,它们都存放在一个叫做JOB_LIST的表中:
create table job_list (
id NUMBER, sql_text VARCHAR2(1000),
executed NUMBER default 0, timestamp orig_time default sysdate
);
2. 创建触发器
接着,我们需要编写一个触发器,使它能够定时扫描 job_list 表,如果发现某条 SQL 语句还没有被执行,就立即执行它。以下是触发器的示例代码:
create or replace trigger check_job
before insert or update on job_list for each row
declare begin
if :old.executed=0 then execute immediate :old.sql_text;
update job_list set executed=1
where id = :old.id; end if;
end;
在这个触发器中,用 before insert or update 来判断是在 insert 或 update 事件发生前执行;for each row 表示触发器将在每行插入或更新时执行;execute immediate 则用来执行 job_list 表中存放的 SQL 语句;最后,对表中的 Executed 字段将做标记,以标识该条 SQL 语句已经执行完毕。
3. 创建定时器
最后,我们还需要创建一个定时器,每当触发器被触发时,它都会激活触发器,从而自动执行 job_list 表中存放的 SQL 语句,如下所示:
create or replace trigger trigger_timer
after logon on database begin
execute immediate 'alter trigger check_job enable'; dbms_scheduler.create_job
( job_name => 'CHECK_JOB',
job_type => 'PLSQL_BLOCK', job_action => 'begin check_job; end;',
start_date => systimestamp, repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
end_date => NULL, enabled => TRUE,
auto_drop => FALSE, comments => 'Check job every minute.'
); end;
完成上述 3 步流程,Oracle 触发器便可以实现数据库自动任务处理了。触发器可以在指定时间或特定条件被激活,根据指定的 SQL 语句执行,以达到管理数据库和执行定时任务的目的,从而实现数据库自动任务处理。