oracle定时任务,两张表同步状态
步骤一;
创建两张测试表;
创建表主表
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视图语句。如下图,创建视图编译正常,没有问题。
第三步:创建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
下一篇: 数据库权限有关问题