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