huawei-大量数据分批处理思想,自定义游标,游标开关

来源:互联网 发布:淘宝众筹东西怎么样 编辑:程序博客网 时间:2024/06/05 18:03


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;
/

原创粉丝点击