千万级数据迁移版本1
PROCEDURE MIGRATE_RB_LIVE AS
CURSOR SAME_MATCH
IS SELECT /*+parallel(8)*/ S.MATCH_ID,S.SCHEDULE_ID,M.THIRD_ID FROM DYBF_SCHEDULE S
LEFT JOIN THIRD_MATCH M ON S.MATCH_ID = M.ID WHERE S.MATCH_ID IS NOT NULL;
TYPE SAME_MATCH_RECORD IS RECORD
(
MATCH_ID DYBF_SCHEDULE.MATCH_ID%TYPE,
SCHEDULE_ID DYBF_SCHEDULE.SCHEDULE_ID%TYPE,
THIRD_ID THIRD_MATCH.THIRD_ID%TYPE
);
TYPE SAME_MATCH_RECORD_COLLECTION IS TABLE OF SAME_MATCH_RECORD;
ARRAY_SAME_MATCH_RECORD SAME_MATCH_RECORD_COLLECTION;
NEW_LIVE_EVENT_ID BF_RB_LIVE_EVENT.ID%TYPE;
LIVE_RECORD_COUNT NUMBER;
ALL_LIVE_RECORD_COUNT NUMBER := 0;
V_CUR_ID NUMBER;
S_D TIMESTAMP;
E_D TIMESTAMP;
BEGIN
-- DBMS_OUTPUT.ENABLE(buffer_size => null);
S_D := SYSTIMESTAMP;
OPEN SAME_MATCH;
LOOP
/*对赛事记录分批次提取(flag = 1000)给记录集合(ARRAY_SAME_MATCH_RECORD)*/
FETCH SAME_MATCH BULK COLLECT INTO ARRAY_SAME_MATCH_RECORD LIMIT FLAG;
EXIT WHEN ARRAY_SAME_MATCH_RECORD.COUNT = 0;
/*循环遍历记录集合*/
FOR I IN ARRAY_SAME_MATCH_RECORD.FIRST .. ARRAY_SAME_MATCH_RECORD.LAST
LOOP
V_CUR_ID := ARRAY_SAME_MATCH_RECORD(I).MATCH_ID;
LIVE_RECORD_COUNT := 0;
/*根据当前集合记录中的赛事编号查出其文字直播记录*/
FOR K IN (SELECT /*+parallel(8)*/ E.EVENT_NUM,E.RB_CODE_ID,E.CUR_TIME,E.RE_EVENT_NUM,E.ADD_INFO,
E.STATE FROM DYBF_RB_LIVE_EVENT E WHERE E.GAME_ID = ARRAY_SAME_MATCH_RECORD(I).THIRD_ID)
LOOP
LIVE_RECORD_COUNT := LIVE_RECORD_COUNT + 1;
SELECT SEQ_BF_RB_COMM_ID.NEXTVAL INTO NEW_LIVE_EVENT_ID FROM DUAL;
INSERT /*+APPEND*/ INTO BF_RB_LIVE_EVENT
(
ID,
GAME_ID,
EVENT_NUM,
RB_CODE_ID,
CUR_TIME,
RE_EVENT_NUM,
ADD_INFO,
STATE
)
VALUES
(
NEW_LIVE_EVENT_ID,
ARRAY_SAME_MATCH_RECORD(I).SCHEDULE_ID,
K.EVENT_NUM,
K.RB_CODE_ID,
K.CUR_TIME,
K.RE_EVENT_NUM,
K.ADD_INFO,
K.STATE
);
END LOOP;
COMMIT;
ALL_LIVE_RECORD_COUNT := ALL_LIVE_RECORD_COUNT + LIVE_RECORD_COUNT;
DBMS_OUTPUT.PUT_LINE('current match_id:' || V_CUR_ID
|| ' third_id:' || ARRAY_SAME_MATCH_RECORD(I).THIRD_ID
|| ' schedule_id:' || ARRAY_SAME_MATCH_RECORD(I).SCHEDULE_ID
|| ' record_count:' || LIVE_RECORD_COUNT);
END LOOP;
END LOOP;
E_D := SYSTIMESTAMP;
MIGRATE_EXECUTE_TIME('MIGRATE_RB_LIVE',S_D,E_D,ALL_LIVE_RECORD_COUNT);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
INSERT_ERR_INFO(SQLERRM,'MIGRATE_RB_LIVE',V_CUR_ID);
DBMS_OUTPUT.PUT_LINE
(
'当前处理失败的数据:[赛事事件编号=' || V_CUR_ID || ' ]' || ' [异常信息:'
|| SQLERRM || ']'
);
CLOSE SAME_MATCH;
END MIGRATE_RB_LIVE;