千万级数据迁移版本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;

posted @ 2016-11-19 16:51  luoqiyi  阅读(217)  评论(0编辑  收藏  举报