当前位置:首页 > 技能相关 > ORACLE > 正文内容

通过PLSQL实现定时执行ORACLE存储过程

admin3年前 (2022-07-11)ORACLE6210 修订时间:2022-07-11 23:28:09

实现表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任务快捷有效,具体方式如图:

2022-07-11_223408.jpg

下图仅填写What值也可,如要任务循环执行则需填写间隔信息;

2022-07-11_223634.jpg

或者:

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、创建定时循环任务;

2022-07-11_224327.jpg

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'
 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/index.php?id=205

标签: Oracle技巧
分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。