Oracle存储过程处理大批量数据

在某次大批量操作后,数据记录达到100万,MOBILE_NO估计有2万个重复,现要求删除重复的号码(只保留一条),

因为该表是业务表,删除时不能影响业务的正常使用。编写存储过程实现删除重复号码的功能。

 

要求如下:

1、为保证删除的数据以后可查,在删除时要先做备份,备份不成功则不能进行删除。

2、要有日志记录,比如删除所花时间,删除成功了多少条,失败多少条等操作信息。

 

CREATE OR REPLACE Procedure Prc_Call Is
  Type Tp_Info_Id Is Table Of Number Index By Binary_Integer;
  v_Info_Id Tp_Info_Id;

  v_Start_Dt Date;--    开始时间
  v_End_Dt   Date;--    结束时间

  v_Process_Count Number;--    记录删除成功条数
Begin
  v_Process_Count := 0;
  -- 让备份和删除,处于同一个事务中 
  -- %sqlrowcount  得到sql执行次数

  --    将删除的记录重新插入表中
  Insert Into Call_Book_Info
    (Info_Id, Mobile_No, Callin_Time, Callout_Time, Status)
    Select * From Tt_Backup_Call_Info;
  Commit;

  --动态sql
  Execute Immediate 'TRUNCATE table Tt_Backup_Call_Info';

  ---备份
  Insert Into Tt_Backup_Call_Info
    (Info_Id, Mobile_No, Callin_Time, Callout_Time, Status)
    Select Info_Id, Mobile_No, Callin_Time, Callout_Time, Status
      From Call_Book_Info T1
     Where T1.Info_Id Not In (Select Max(t.Info_Id) Maxid
                                From Call_Book_Info t
                               Group By t.Mobile_No);

  --    开始时间
  Select Sysdate Into v_Start_Dt From Dual;
  
  --    删除
  Delete From Call_Book_Info t
   Where t.Info_Id In (Select T1.Info_Id From Tt_Backup_Call_Info T1);

  v_Process_Count := Sql%Rowcount;

  --    结束时间
  Select Sysdate Into v_End_Dt From Dual;

  --    将删除信息进行记录
  Insert Into Tmp_Log
    (Log_Id, Start_Dt, End_Dt, Process_Tm, Create_Tm, Process_Count)
  Values
    (Seq_Test_Demo.Nextval,
     v_Start_Dt,
     v_End_Dt,
     ((v_End_Dt - v_Start_Dt) * 24 * 60 * 60),
     Sysdate,
     v_Process_Count);

  Commit;
End Prc_Call;

 

猜你喜欢

转载自1160514291.iteye.com/blog/2072128
今日推荐