在某次大批量操作后,数据记录达到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;