欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle定时任务,两张表同步状态

程序员文章站 2022-05-03 10:24:53
...

步骤一;
创建两张测试表;
创建表主表
COR_GTW_CESHI
备份表
COR_GTW_CESHI_BEIFEN

-- Create table
create table COR_GTW_CESHI
(
  id                CHAR(20) not null,
  cmd_type          VARCHAR2(40),
  req_package_id    CHAR(20),
  req_seq_no        VARCHAR2(32),
  cmd_status        CHAR(2),
  req_times         INTEGER,
  ref_biz_id        CHAR(20),
  trans_no          VARCHAR2(32),
  pay_acnt_no       VARCHAR2(32),
  pay_acnt_name     VARCHAR2(80),
  pay_bank_code     VARCHAR2(12),
  pay_bank_name     VARCHAR2(80),
  rec_acnt_no       VARCHAR2(32),
  rec_acnt_name     VARCHAR2(80),
  rec_bank_code     VARCHAR2(12),
  rec_bank_name     VARCHAR2(80),
  rec_branch_no     VARCHAR2(50),
  rec_branch_name   VARCHAR2(80),
  rec_zone_code     VARCHAR2(12),
  pay_mode          CHAR(2),
  currency_code     CHAR(3),
  amount            NUMBER(18,2),
  txn_date          CHAR(8),
  txn_time          CHAR(6),
  plan_exec_date    CHAR(8),
  result_code       VARCHAR2(12),
  result_msg        VARCHAR2(255),
  lock_flag         CHAR(20),
  create_date       VARCHAR2(8),
  create_time       VARCHAR2(6),
  last_mod_date     VARCHAR2(8),
  last_mod_time     VARCHAR2(6),
  create_sys_date   VARCHAR2(8),
  last_mod_sys_date VARCHAR2(8),
  pay_zone_code     VARCHAR2(12),
  postscript        VARCHAR2(60),
  deduct_flag       CHAR(1)
)

插入数据,数据随便插入几条数据,两张表相同的数据。
修改主表COR_GTW_CESHI的cmd_status 字段,为了验证备份表的cmd_status 是否能够被更新。

第二步骤;创建视图
大家根据自己的实际需求,编写自己的视图脚本,备份表根据主表,更新备份的cmd_status字段状态,保证两张表相同流水号的数据,状态一致。参考脚本:

CREATE OR REPLACE PROCEDURE ceshi2 IS
cursor c_job
is
select a.cmd_status,a.trans_no
from COR_GTW_CESHI a;
--定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行数据到c_row
fetch c_job into c_row;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
update COR_GTW_CESHI_BEIFEN b set b.cmd_status=c_row.cmd_status;
end loop;
--关闭游标
close c_job;
end;

创建好视图,一定要检查视图编译是否有问题,如果有问题修改自己的slq视图语句。如下图,创建视图编译正常,没有问题。
oracle定时任务,两张表同步状态
第三步:创建orale定时任务,定时执行视图,更新备份表的cmd_status字段,保证两个表相同流水号,状态一致。

declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(
            JOB => job,/*自动生成JOB_ID*/
            WHAT => 'ceshi2;',/*需要执行的存储过程名称或SQL语句*/
            NEXT_DATE => sysdate,/*初次执行时间-立即执行*/
            INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)'/*每隔1分钟执行一次*/);
   commit;
end;

到这里,oralce定时任务就创建好了,可以验证自己的COR_GTW_CESHI_BEIFEN 是否每隔1分钟被执行更新一次。

1、当前用户定时任务

select count(*) from user_jobs;

有权限访问的定时任务

select count(*) from all_jobs;

整个数据库所有定时任务

select count(*) from dba_jobs;

2、手动执行定时任务

BEGIN
DBMS_JOB.RUN(643); --643为任务的ID
END;
3、停止定时任务

declare
begin
dbms_job.broken(24,true,sysdate);/*停止一个job,jobId, job的ID,里面参数true也可是false,next_date(某一时刻停止)

也可是sysdate(立刻停止)。*/
commit;
end;
4、启动指定定时任务

declare
begin
DBMS_JOB.RUN(24); /24 job的id/
commit;
end;
5、删除定时任务

declare
begin
dbms_job.remove(24); ?/删除自动执行的job,参数是 job的id/
commit;
end;
6、修改定时任务的间隔时间

declare
begin
dbms_job.interval(24,interval => ‘TRUNC(SYSDATE)+1’);/*第一个参数为job的ID,第二个参数interval: 计算下一次任务执行

的时间表达式*/
commit;
end;
7、修改下一次执行时间

declare
begin
dbms_job.next_date(24,to_date(‘2020-11-9 12:08:00’,‘yyyy-mm-dd hh24:mi:ss’)); /*第一个参数:job的ID;第二个参数:

要修改后的计算下一次执行的时间表达式*/
commit;
end;
8、修改定时任务要执行的操作

declare
begin
dbms_job.what(24,‘testJob2();’);/* 第一个参数:job的ID;第二个参数:要更改的新操作名称(操作名必须存在)*/
commit;
end;

INTERVAL 部分参数值示例:

每天午夜12点: ‘TRUNC(SYSDATE + 1)’

每天早上8点30分: ‘TRUNC(SYSDATE + 1) + (860+30)/(2460)’

每星期二中午12点: ‘NEXT_DAY(TRUNC(SYSDATE ), ‘‘TUESDAY’’ ) + 12/24’

每个月第一天的午夜12点: ‘TRUNC(LAST_DAY(SYSDATE ) + 1)’

每个季度最后一天的晚上11点: ‘TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ‘Q’ ) -1/24’

每星期六和日早上6点10分: 'TRUNC(LEAST(NEXT_DAY(SYSDATE, '‘SATURDAY"), NEXT_DAY(SYSDATE, “SUNDAY”))) + (6×60+10)/(24×60)’

每月25号00:00执行: ‘TRUNC(LAST_DAY(SYSDATE ) + 25)’
1:每分钟执行
Interval => TRUNC(sysdate,‘mi’) + 1/ (24*60)

Interval => sysdate+1/1440

2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)

3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,‘星期一’))+1/24

4:每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),‘Q’) + 1/24

6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,‘yyyy’),6)+1/24

7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,‘yyyy’),12)+1/24