1.先创建备份表;
2.在创建一个表记录用于记录最大的id;
3.创建存储过程;
4.定时调用;
--数据表
CREATE TABLE tb_transaction(
ID NUMBER PRIMARY KEY,
ACCOUNT VARCHAR2(18),--账号
amount NUMBER,--余额
currdate DATE
);
--序列
CREATE SEQUENCE seq_tb_tran;
--插入数据
INSERT INTO tb_transaction(ID,account,amount,currdate)VALUES(seq_tb_tran.nextval,'10086001',5000,SYSDATE);
INSERT INTO tb_transaction(ID,account,amount,currdate)VALUES(seq_tb_tran.nextval,'10086002',2000,SYSDATE);
INSERT INTO tb_transaction(ID,account,amount,currdate)VALUES(seq_tb_tran.nextval,'10086003',6000,SYSDATE);
INSERT INTO tb_transaction(ID,account,amount,currdate)VALUES(seq_tb_tran.nextval,'10086004',7000,SYSDATE);
INSERT INTO tb_transaction(ID,account,amount,currdate)VALUES(seq_tb_tran.nextval,'10086005',1000,SYSDATE);
1.先创建备份表;
--得到一个备份表,没有数据 select * from tb_back;
CREATE TABLE tb_back AS SELECT * FROM tb_transaction WHERE ID=9999;
2.在创建一个表记录用于记录最大的id;
CREATE TABLE tb_maxid(
maxid INT
);
--插入初始值0
INSERT INTO tb_maxid(maxid) Values(0);
3.创建存储过程;
--思路
-- 1.查询 表中的所友数据
--2. 插入 备份表
--3. 保存当日插入最大id
--注意commit
create or replace procedure backpro IS
--抓取数据 获取最大的id
CURSOR c_maxId IS SELECT * FROM tb_maxid;
/***
--定义带参数的 游标 tb_student
CURSOR cr_tb_student(v_cl_id tb_class.code%TYPE)
IS SELECT * FROM tb_student WHERE class_id = v_cl_id;
*/
--抓取备份数据
-- 备份数据,当天需要备份的数据,v_maxid是昨天备份的最大id
CURSOR c_tran(v_maxid tb_maxid.maxid%TYPE) IS SELECT * FROM tb_transaction WHERE ID > v_maxid;
--多少条数据就 commit;
code INT := 0;
--记录最大id
v_id INT;
begin
FOR cd IN c_maxId
LOOP
dbms_output.put_line('找到的id '||cd.Maxid);
-- 遍历
FOR ct IN c_tran(cd.Maxid)
LOOP
code := code+1;
--ID,account,amount,currdate
dbms_output.put_line('找到的数据:-> '||ct.id||' '|| ct.account||ct.amount||ct.currdate);
--把数据插入表中.
INSERT INTO tb_back VALUES ct;
IF(code = 1000) THEN
COMMIT;
--清零
code := 0;
END IF;
EXIT WHEN c_tran%NOTFOUND;
END LOOP;
--查到最大的id 存到 变量v_id
SELECT MAX(id)INTO v_id FROM tb_back;
--在update 更新 tb_maxid 表
UPDATE tb_maxid SET maxid=v_id;
--最后一次不满足1000条的
COMMIT;
EXIT WHEN c_maxId%NOTFOUND;
END LOOP;
end backpro;
4.定时调用;
--创建调度任务定时器 一创建就会执行一次
declare
jobno number;
begin
-- dbms_job.submit(job编号,调用哪个存储过程,间隔时间);
dbms_job.submit(
jobno,
what => 'backpro;', --backpro为存储过程的名称
Interval => 'TRUNC(sysdate,''mi'') + 1 / (24*60)' --定义时间间隔每分钟
);
commit;
end;
--删除调度任务定时器 22 你要具体看dbms_jobs 目录下的编号
begin
dbms_job.remove(22) ;
commit;
end;
select * from user_jobs;--查看调度任务
select * from dba_jobs_running;--查看正在执行的调度任务
select * from dba_jobs;--查看执行完的调度任务
--查询表数据:
SELECT * FROM tb_transaction;
SELECT * FROM tb_back;
SELECT * FROM tb_maxid;
1、 每分钟执行
Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)
2、 每天定时执行
例如:每天的凌晨2点执行
Interval => TRUNC(sysdate) + 1 +2 / (24)
3、 每周定时执行
例如:每周一凌晨2点执行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
4、 每月定时执行
例如:每月1日凌晨2点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5、 每季度定时执行
例如每季度的第一天凌晨2点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
6、 每半年定时执行
例如:每年7月1日和1月1日凌晨2点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7、 每年定时执行
例如:每年1月1日凌晨2点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24