У меня есть два CURSOR FOR LOOPS, один для поиска AVG(USAGE) в праздничные дни, другой для поиска AVG(USAGE) в обычные дни. Информация, полученная из них, записывается в другую таблицу. Он работает довольно медленно, и я уверен, что должен быть способ повысить эффективность, но я все еще довольно новичок в этом, и я подозреваю, что мой код в лучшем случае неуклюж.
create or replace PROCEDURE USAGE_FORECAST AS
v_dayNumber NUMBER;
v_halfHour NUMBER;
CURSOR c_nonPublicHoliday is
SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
FROM INITIAL_TABLE, HOLIDAY_TABLE
WHERE (to_char(day, 'd') = v_dayNumber
OR to_char(day, 'd') = v_dayNumber-7)
AND INITIAL_TABLE.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)
AND HH = v_halfHour
GROUP BY STREET, SUBURB, DAY, HH;
CURSOR c_publicHoliday is
SELECT STREET, SUBURB, DAY, HH, AVG(USAGE) AVG_USAGE
FROM INITIAL_TABLE, HOLIDAY_TABLE
WHERE V_NEM_RM16.DAY IN (SELECT HOLIDAY_DATE FROM HOLIDAY_TABLE)
AND HH = v_halfHour
GROUP BY STREET, SUBURB, DAY, HH;
BEGIN
FOR v_forecastDay IN 1..7 LOOP
v_dayNumber := v_forecastDay;
FOR v_halfHourInterval IN 1..48 LOOP
v_halfHour := v_halfHourInterval;
FOR R1 IN c_nonPublicHoliday LOOP
INSERT INTO LOCAL_TABLE
(STREET, SUBURB, DAY, HH, USAGE)
VALUES
(R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
END LOOP;
FOR R1 IN c_PublicHoliday LOOP
INSERT INTO LOCAL_TABLE
(STREET, SUBURB, DAY, HH, USAGE)
VALUES
(R1.STREET, R1.SUBURB, SYSDATE, R1.HH, R1.AVG_USAGE);
END LOOP;
END LOOP;
END LOOP;
Теперь, на данный момент, выполняются оба цикла CURSOR FOR независимо от того, является ли день государственным праздником или нет. Я уверен, что есть способ структурировать мои операторы выбора так, чтобы в этом не было необходимости, но на данный момент это выше моего понимания. Во-вторых, я подозреваю, что праздничные дни возвращают слишком много информации, но это может быть просто потому, что на следующей неделе здесь, в Австралии, будет много праздничных дней.