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