Oracleストアド・プロシージャは大量のデータを処理します.


ある大量の操作後、データ記録は100万に達し、MOBILE_NOは2万個の重複があると推定し、現在重複番号の削除を要求している(1本しか残っていない).
このテーブルはビジネス・テーブルであるため、削除時にビジネスの正常な使用に影響を与えることはできません.ストレージ・プロシージャを記述して重複番号を削除する機能を実現します.
 
要件は次のとおりです.
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;