orcale 备份数据 定时执行

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
 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javaGHui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值