아래와 같이 프로시저를 만들어서 사용하고 있습니다.
GATHERINFOLOG는 하루에 약 40~50만건정도 데이터가 저장되며
KeyID로 Point 지점을 경유한 순서를 조회한 후 해당 결과를 DB에 Insert 하는데
시간이 너무 오래 걸려 입력 시간을 00~06, 07~12, 13-18, 19~23시로 나눠서
프로시져를 돌리고 있습니다.
그런데 프로시져가 시간대별로 잘 처리하다가 한순간 멈춰 버리고 아무 동작도 안 하는 상태가 발생하는데
이유를 몰라서 문의를 드립니다.
CREATE OR REPLACE PROCEDURE PROC_POINTTRIP (v_RecvSTime IN VARCHAR2, v_RecvEDTime In VARCHAR2, v_SeqNo In Number)
IS
v_Analysis DATE;
v_KeyID VARCHAR2(50);
v_Step VARCHAR2(4);
v_ST_Time DATE;
v_ST_Point VARCHAR2(50);
v_ED_Time DATE;
v_ED_Point VARCHAR2(50);
v_Path_Point VARCHAR2(512);
CURSOR VEHICLE_TRIP
IS
SELECT TO_DATE(SUBSTR(v_RecvSTime, 1, 8), 'YYYYMMDD') ANALYSIS_DATE, KeyID, STEP,
MAX(DECODE(RN, 1, RCVTIME, '')) ST_TIME, MAX(DECODE(RN, 1, PointID, '')) ST_PointID,
MAX(DECODE(RN, STEPCNT, RCVTIME, '')) ED_TIME, MAX(DECODE(RN, STEPCNT, PointID, '')) ED_PointID,
SUBSTR (XMLAGG (XMLELEMENT (A, ',' || PointID) ORDER BY RCVTIME).EXTRACT ('//text()'), 2) PATH_Point
FROM
(SELECT KeyID, PointID, STEP, RCVTIME,
COUNT(*) OVER(PARTITION BY KeyID, STEP) STEPCNT,
ROW_NUMBER() OVER(PARTITION BY KeyID, STEP ORDER BY RCVTIME) RN
FROM
(SELECT KeyID, PointID, RCVTIME,
SUM(FLAG) OVER(PARTITION BY KeyID ORDER BY RCVTIME) STEP
FROM
(SELECT KeyID, PointID, RCVTIME,
CASE WHEN LAG(RCVTIME) OVER(PARTITION BY KeyID ORDER BY RCVTIME) > RCVTIME -1/24/60 * 30
THEN 0 ELSE 1 END FLAG
FROM
(SELECT KeyID, PointID, TO_DATE(RCVTIME, 'YYYYMMDDHH24MISS') RCVTIME
FROM GATHERINFOLOG A
WHERE RCVTIME BETWEEN v_RecvSTime || '0000' AND v_RecvEDTime || '5959'
)
))
)
WHERE STEPCNT > 4
GROUP BY KeyID, STEP
ORDER BY KeyID, STEP;
BEGIN
OPEN VEHICLE_TRIP;
DBMS_OUTPUT.PUT_LINE('==============================================');
LOOP
FETCH VEHICLE_TRIP INTO v_Analysis, v_KeyID, v_Step, v_ST_Time, v_ST_Point, v_ED_Time, v_ED_Point, v_Path_Point;
EXIT WHEN VEHICLE_TRIP%NOTFOUND;
INSERT INTO ITS_VEHICLETRIP_TEMP
(ANALYSIS_DATE, KeyID, SEQNO, STEP, ST_TIME, ST_PointID, ED_TIME, ED_PointID, PATH_PointID)
VALUES
(v_Analysis, v_KeyID, v_SeqNo, v_Step, v_ST_Time, v_ST_Point, v_ED_Time, v_ED_Point, v_Path_Point);
--DBMS_OUTPUT.PUT_LINE(v_KeyID || ', ' || v_Step || ', ' || v_Path_Point);
commit;
END LOOP;
--DBMS_OUTPUT.PUT_LINE('Record Cnt = ' || VEHICLE_TRIP%ROWCOUNT);
CLOSE VEHICLE_TRIP;
END;
|