DB2 一次性删除多条数据

DB2数据库中,删除表中的重复数据,可以使用如下语句:
delete from (
select 1 from (select a,b,c,row_number() 
                      over(partition by a,b,c order by a,b,c) 
                      as row_num 
                 from tab) as e 
where row_num >1) 
对于AS400上面的DB2,可以使用ROWID()函数获取需要删除的数据的行号,再进行删除。


若要每次删除表中的多条数据,并且在批量删除之后提交事物,可以如下处理:
delete from (select 1 from tablename 
              where condition
              fetch first N rows noly)
N表示每次需要删除的数据数量。

下面是个测试:
创建测试表
create table clb_test(
empno char(8) not null,
ename varchar(20),
sex char(1),
hiredate date)

使用存储过程进行多条数据添加,注意存储过程的使用
create procedure tst_insert()
language sql
specific tst_insert --指定唯一的标识
isrt:begin
     --
     declare v_i smallint default 0;
     declare v_empno char(9) default '';
     declare v_hiredate date;
     declare v_sex char(1);
     --使用循环进行数据添加
     repeat
         set v_i = v_i +1;
         set v_empno = 'CLB'||digits(v_i);
         set v_sex = (case when mod(v_i,2)=0 then 'F' else 'M' end);

         if (v_i=1) then
         set v_hiredate = current date;
         else
         set v_hiredate = v_hiredate + 1 days;
         end if;

         insert into clb_test(empno,ename,sex,hiredate)
         values(v_empno,'ChenLinbo',v_sex,v_hiredate);
         --没添加100条数据,提交一次
         if ((v_i/100) = 0) then
             commit work;
         end if;
         --注意,until语句结尾不能有分号结尾符号(;)
         until v_i = 999
     end repeat;
end isrt
每个标识一定要有结束,比如存储过程体结束(end isrt)对应开始(isrt:begin)。

执行添加数据的存储过程之前,表中无数据:
db2 => select *from clb_test
EMPNO    ENAME                SEX HIREDATE
-------- -------------------- --- ----------

  0 条记录已选择。

对于无参存储过程,调用的时候不用给出参数,若有参数则必须指定参数。
db2 => call tst_insert()
  返回状态 = 0
调用tst_insert存储过程之后,表中添加了999条数据:
db2 => select count(*) from clb_test
1
-----------
        999
  1 条记录已选择。

db2 => select *from clb_test fetch first 10 rows only

EMPNO    ENAME                SEX HIREDATE
-------- -------------------- --- ----------
CLB00001 ChenLinbo            M   2013-04-30
CLB00002 ChenLinbo            F   2013-05-01
CLB00003 ChenLinbo            M   2013-05-02
CLB00004 ChenLinbo            F   2013-05-03
CLB00005 ChenLinbo            M   2013-05-04
CLB00006 ChenLinbo            F   2013-05-05
CLB00007 ChenLinbo            M   2013-05-06
CLB00008 ChenLinbo            F   2013-05-07
CLB00009 ChenLinbo            M   2013-05-08
CLB00010 ChenLinbo            F   2013-05-09
  10 条记录已选择。

一次性删除多条数据,可以使用select语句先获取一次性删除的数据数量,再进行delete,如下:
create procedure tst_delete(out p_batches int)
language sql
specific tst_delete
dlt:begin
    declare sqlstate char(5) default '00000';
    declare rows_deleted int default 0;
    declare v_return int default 0;
    repeat
          delete from (select 1 from clb_test
                       where year(hiredate) < year(date('2015-01-01'))
                       fetch first 10 rows only);
          get diagnostics rows_deleted = row_count;
          set v_return = v_return + rows_deleted;
          commit;
          until rows_deleted=0
    end repeat;


    return v_return;
end dlt

调用存储过程tst_delete
db2 => call tst_delete(?)
  输出参数的值
  --------------------------
  参数名: P_BATCHES
  参数值: -

  返回状态 = 0
db2 => select count(*) from clb_test
1
-----------
        388
  1 条记录已选择。

db2 => select *from clb_test order by hiredate fetch first 10 rows only

EMPNO    ENAME                SEX HIREDATE
-------- -------------------- --- ----------
CLB00612 ChenLinbo            F   2015-01-01
CLB00613 ChenLinbo            M   2015-01-02
CLB00614 ChenLinbo            F   2015-01-03
CLB00615 ChenLinbo            M   2015-01-04
CLB00616 ChenLinbo            F   2015-01-05
CLB00617 ChenLinbo            M   2015-01-06
CLB00618 ChenLinbo            F   2015-01-07
CLB00619 ChenLinbo            M   2015-01-08
CLB00620 ChenLinbo            F   2015-01-09
CLB00621 ChenLinbo            M   2015-01-10

  10 条记录已选择。

--the end--

你可能感兴趣的:(DB2 一次性删除多条数据)