利用游标进行数据库数据备份

来源:互联网 发布:mysql 5.6.25.tar.gz 编辑:程序博客网 时间:2024/05/19 01:33

今天同事问我一个问题:他需要每天将tableA中指定条件下的数据copy到tableB中,并删除tableB中已被copy的数据,应该用什么方法高效一些?听到这个方法之后第一反映就是想到在我上家公司的时候,也做了同样的数据备份工作,不过当时脚本是我老大写的,我只是看了一眼,大概是将需要备份的数据查询出来,在循环结果集逐条将数据移走,为了减少数据压力,并每处理500记录之后commit一次。当时只是看了这种想法,也没多想这种写法用到了什么,结果也只是告诉同事这样一个思路。

现在回来咨询了下度娘,终于找到了原来使用的是游标(这里使用的是Oracle,当然游标在DB2,Mysql等数据库中也是可以使用的)

现在简单举例利用游标进行数据备份(移动)

背景:

表A

testA(

id int,

name varchar2(20)

)

表B

testB(

id int,

name varchar2(20)

)


第一种游标使用方法

declare
       --类型定义
       cursor c_job
       is
       select id,name
       from testa;
       --定义一个游标变量c_row c_job%rowtype ,该类型为游标c_job中的一行数据类型
       c_row c_job%rowtype;
begin
       for c_row in c_job loop
           insert into testB(id,name)values(c_row.id,c_row.name);

    delete from testA where id=c_row.id and name=c_row.name;
       end loop;
       commit;
end;

在上面一种方法中,一次性将数据全部,如果数据量较小的话,倒没有什么影响,但如果是大量的数据,一次做commit,会大的增加数据库的资源消耗,因此可以采用下面的方法来拿到rownum(Oracle有此关键字)来定数据量commit

declare
       --类型定义
       cursor c_job
       is
       select id,name,rownum
       from testB;
       --定义一个游标变量c_row c_job%rowtype ,该类型为游标c_job中的一行数据类型
       c_row c_job%rowtype;
begin
       for c_row in c_job loop
           insert into testA(id,name)values(c_row.id,c_row.name);
           delete from testB where id=c_row.id and name=c_row.name;
           if c_row.rownum=2 then
              commit;
           end if;
       end loop;
       commit;
end;

当然如果不用rownum的话,也可以定义变量来进行i++的操作记录

declare
       --定义变量i为int类型,值为0;
       i int:=0;
       --类型定义
       cursor c_job
       is
       select id,name,rownum
       from testA;
       --定义一个游标变量c_row c_job%rowtype ,该类型为游标c_job中的一行数据类型
       c_row c_job%rowtype;
begin
       for c_row in c_job loop
           i:=i+1;--进行i+1
           insert into testB(id,name)values(c_row.id,c_row.name);
           delete from testA where id=c_row.id and name=c_row.name;
           if i=2 then
              commit;
           end if;
       end loop;
       commit;
end;


对于游标不熟悉的同鞋,这里提供一份游标学习资料,希望可以帮忙到大家(其实我也是刚才学习到,吼吼)

Oracle游标使用方法及语法大全

Oracle游标详解

原创粉丝点击