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