通过PLSQL实现定时执行ORACLE存储过程
实现表A数据定时插入B表,更新其中时间字段,可用如下方法实现:
使用知识点:
1、Merge into是Oracle语法,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据
注意:on后面的条件一定要用()包起来
2、存储过程
create or replace procedure 存储过程名 as
begin
...
commit;
end;
3、DBMS_JOBS
JOB任务,建议使用PLSQL工具去创建
方法:
1、Merge into
1.1 条件满足就执行更新语句否则执行插入语句。
merge into 目标表 a using 源表 b on ('两张表数据的连接条件') when matched then update set a.name = b.name where a.name like '%段%' -------更新语句后面可以加过滤条件 when not matched then insert (a.name) values(b.name)
1.2 只做更新操作
merge into 目标表 a using 源表 b on ('两张表数据的连接条件') when matched then update set a.name = b.name where a.name like '%段%' -------更新语句后面可以加过滤条件
1.3 只做插入操作
merge into 目标表 a using 源表 b on ('两张表数据的连接条件') when not matched then insert (a.字段1, a.字段2 ...) values(b.字段1, b.字段2 ...)
2、存储过程
注意:存储过程一定注意其状态,创建错误会引起JOB任务创建失败;
create or replace procedure 存储过程名 as begin 执行语句; commit; end;
3、DBMS_JOBS
使用PLSQL创建dbms_jobs任务快捷有效,具体方式如图:
下图仅填写What值也可,如要任务循环执行则需填写间隔信息;
或者:
declare job number(2); begin sys.dbms_job.submit(job => job, what => 'proc_add_test;', next_date => to_date('11-07-2022 22:10:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'TRUNC(sysdate,''mi'') + 1/(24*60)'); commit; end;
示例:
1、创建元数据表、记录数据表;
// 元数据表格 create table copy_y ( name varchar2(10), des varchar2(100), date_time date ) // 记录数据表 create table copy_m ( name varchar2(10), des varchar2(100), date_time date )
2、组建存储过程SQL语句;
merge into copy_m a using copy_y b on (a.date_time <TO_DATE(TO_CHAR(sysdate,'YYYY-MM-DD'),'YYYY-MM-DD')) when not matched then insert (a.name,a.des,a.date_time) values(b.name,b.des,sysdate) //字段的录入时间为任务执行时间
3、创建存储过程 PROC_ADD_TEST;
create or replace procedure proc_add_test as begin merge into lftxt.copy_m a using lftxt.copy_y b on (a.date_time <TO_DATE(TO_CHAR(sysdate,'YYYY-MM-DD'),'YYYY-MM-DD')) when not matched then insert (a.name,a.des,a.date_time) values(b.name,b.des,sysdate); commit; end;
4、创建定时循环任务;
或
declare job number(2); begin sys.dbms_job.submit(job => job, what => 'proc_add_test;', next_date => to_date('11-07-2022 22:10:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'TRUNC(sysdate,''mi'') + 1/(24*60)'); commit; end;
知识点:
1、时间间隔样例:
1.1 每分钟执行一次
TRUNC(sysdate,'mi') + 1/(24*60)
1.2 每天定时执行
TRUNC(sysdate) + 1 +1/(24)
1.3 每周一一点执行
TRUNC(next_day(sysdate,'星期一'))+1/24
1.4 每月凌晨1点执行
TRUNC(LAST_DAY(SYSDATE))+1+1/24
1.5 每季度第一天凌晨1点执行
TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
1.6 每半年执行一次
ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
1.7 每年执行一次
ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24
1.8 每天固定时间执行
Trunc(Sysdate+1) + (8*60+10)/24*60
1.9 每小时的15分执行
trunc(sysdate,'hh')+(60+15)/(24*60)
2、查询JOB记录
select job, next_date, next_sec, failures, broken from user_jobs;
3、查看存储过程记录
select * from user_objects where object_type='PROCEDURE'