huawei-大量數據分批處理思想,自定義遊標,遊標開關


CREATE OR REPLACE PROCEDURE p_DayLog_Cursor---分批處理思想
(iMaxTableID NUMBER := NULL)
AS
  DAYLOG_ERROR EXCEPTION;
  -- 定義取話單遊標
  CURSOR c_DayLog_Bill IS
  SELECT CALLID,CALLIDNUM,CALLERNO,CALLEENO,WAITBEGIN,WAITEND,SkillID FROM tCurrentBillLog
  WHERE TableID <= tMinTableID ORDER BY TableID;
BEGIN
  -- 如果iMaxTableID爲空,取表tCurrentBillLog當前最大的TableID
  IF iMaxTableID IS NULL THEN
  SELECT MAX(TableID) INTO tMaxTableID FROM tCurrentBillLog;

  -- 自動日結先判斷表中的最大和最小的TableID,控制一次日結只結20000條數據
  SELECT MIN(TableID) INTO tMinTableID FROM tCurrentBillLog;
  IF tMaxTableID - tMinTableID > 40000 THEN
  tMaxTableID := tMinTableID + 40000;
  END IF;
  ELSE -- 手工日結
  tMaxTableID := iMaxTableID;
  SELECT MIN(TableID) INTO tMinTableID FROM tCurrentBillLog;
  END IF;

  -- 爲避免事務過大,將事務進行分割,一次做2000條話單
  tMinTableID := tMinTableID + 4000;
  
  -- 如果tMinTableID+2000大於tMaxTableID,則將tMaxTableID值賦給tMinTableID
  IF tMinTableID >= tMaxTableID THEN
  tMinTableID := tMaxTableID;
  END IF;

  -- 開始以2000條數據爲一個事務進行循環
  WHILE tMinTableID <= tMaxTableID LOOP
  OPEN c_DayLog_Bill;
  LOOP
  FETCH c_DayLog_Bill INTO
  v_UserLevel,v_UserType,v_CallInCause,v_EnterReason,v_LeaveReason,v_PreDeviceNo,v_SkillID;
  EXIT WHEN c_DayLog_Bill%NOTFOUND;

  -- 調用日結分發存儲過程
  v_Ret := p_DayLog_Dispense(v_CALLID,v_CALLIDNUM,v_CallInCause,v_SkillID);
  IF v_Ret = 1 THEN
  RAISE DAYLOG_ERROR;
  END IF;
  END LOOP;
  CLOSE c_DayLog_Bill;
  COMMIT;
  -- 刪除已日結的話單
  DELETE FROM tCurrentBillLog WHERE TableID <= tMinTableID;
  COMMIT;

  tMinTableID := tMinTableID + 4000;
  -- 避免多次循環時,最後一段4000數據留到下次日結
  IF tMinTableID >= tMaxTableID AND tMinTableID - tMaxTableID < 4000 THEN
  tMinTableID := tMaxTableID;
  END IF;
  END LOOP;
EXCEPTION
....
END p_DayLog_Cursor;
/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章