Привет всем! Подскажите, пожалуйста, как взять следующий элемент курсора и пропустить текущий? Есть такая процедура: Код | CREATE OR REPLACE PROCEDURE PROC_REGISTER_GAME_RESULT (GAME_ID_ENTRY IN INTEGER, THROW_1_ENTRY IN INTEGER, THROW_2_ENTRY IN INTEGER) AS FRAME_N_1_CHECK INTEGER; THROW_1_N_1 INTEGER; THROW_2_N_1 INTEGER; SKITTLES_N_1 INTEGER;
FRAME_N_2_CHECK INTEGER; SKITTLES_N_2 INTEGER; THROW_1_N_2 INTEGER;
TID INTEGER; FID INTEGER; R INTEGER;
CURSOR EMPTY IS SELECT FRAME_ID, TEAM_ID FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND THROW_1 IS NULL GROUP BY FRAME_ID, TEAM_ID ORDER BY FRAME_ID; BEGIN OPEN EMPTY; FETCH EMPTY INTO FID, TID; -- Проверяет, существует ли предыдущий фрейм. SELECT COUNT(GAME_ID) INTO FRAME_N_1_CHECK FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); -- Если фрейм существует, то берёт количество сбитых кеглей при первом броске, при втором броске -- и общее количество очков. IF (FRAME_N_1_CHECK = 1) THEN BEGIN SELECT THROW_1 INTO THROW_1_N_1 FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); SELECT THROW_2 INTO THROW_2_N_1 FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); SELECT SKITTLES INTO SKITTLES_N_1 FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); END; END IF;
-- Проверяет, существует ли ПРЕДПРЕДыдущий фрейм. SELECT COUNT(GAME_ID) INTO FRAME_N_2_CHECK FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 2); -- Если существует, то берёт количество сбитых кеглей при первом броске и общее количество очков. -- Не берём количество сбитых кеглей при втором броске, потому что это никак не влияет на текущий фрейм. -- Если даже по сумме двух бросков в предпредыдущем фрейме было 10, то это spare, а значит к сумме прибавляется -- лишь один бросок из прудыдущего фрейма. Поэтому нас интересует только вариант, когда в предпредыдущем фрейме -- был страйк, а т.е. 10 очков. IF (FRAME_N_2_CHECK = 1) THEN BEGIN SELECT SKITTLES INTO SKITTLES_N_2 FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 2); SELECT THROW_1 INTO THROW_1_N_2 FROM GAME_SCORES WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 2); END; END IF;
-- Для 1 - 10 фреймов. IF (FID < 11) THEN BEGIN -- Если предыдущий фрейм существует (т.е. текущий уже как минимум второй) и в первом броске был strike, то -- к общей сумме в предыдущем фрейме прибавляются оба броска из текущего фрейма. IF ((FRAME_N_1_CHECK = 1) AND (THROW_1_N_1 = 10)) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY + THROW_2_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); END; END IF; -- Если предыдущей фрейм существует и был не strike, а всего лишь spare, то к общей сумме в предыдущем -- фрейме прибавляется только один первый бросок из текущего фрейма. IF (FRAME_N_1_CHECK = 1) AND (THROW_1_N_1 < 10) AND (THROW_1_N_1 + THROW_2_N_1 = 10) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); END; END IF; -- Если существует ПРЕДПРЕДыдущий фрейм (а значит и предыдущий) и если и у препредыдущего и предыдущего -- в первых бросках были страйки (т.е. 10 очков), то предпредыдущей общей сумме прибавляется один первй бросок из текущего фрейма. IF (FRAME_N_2_CHECK = 1) AND (THROW_1_N_2 = 10) AND (THROW_1_N_1 = 10) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 2); END; END IF; -- Ну и, наконец, обновляется текущий фрейм. UPDATE GAME_SCORES SET THROW_1 = THROW_1_ENTRY, THROW_2 = THROW_2_ENTRY, SKITTLES = (THROW_1_ENTRY + THROW_2_ENTRY) WHERE GAME_ID = GAME_ID_ENTRY AND FRAME_ID = FID AND TEAM_ID = TID; END; END IF;
-- Для 11 фрейма (если он требуется). IF (FID > 10) THEN BEGIN IF (THROW_1_N_1 = 10) OR (THROW_1_N_1 + THROW_2_N_1 = 10) THEN BEGIN -- Если предыдущий фрейм существует (т.е. текущий уже как минимум второй) и в первом броске был strike, то -- к общей сумме в предыдущем фрейме прибавляются оба броска из текущего фрейма. IF ((FRAME_N_1_CHECK = 1) AND (THROW_1_N_1 = 10)) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY + THROW_2_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); END; END IF; -- Если предыдущей фрейм существует и был не strike, а всего лишь spare, то к общей сумме в предыдущем -- фрейме прибавляется только один первый бросок из текущего фрейма. IF (FRAME_N_1_CHECK = 1) AND (THROW_1_N_1 < 10) AND (THROW_1_N_1 + THROW_2_N_1 = 10) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 1); END; END IF; -- Если существует ПРЕДПРЕДыдущий фрейм (а значит и предыдущий) и если и у препредыдущего и предыдущего -- в первых бросках были страйки (т.е. 10 очков), то предпредыдущей общей сумме прибавляется один первй бросок из текущего фрейма. IF (FRAME_N_2_CHECK = 1) AND (THROW_1_N_2 = 10) AND (THROW_1_N_1 = 10) THEN BEGIN UPDATE GAME_SCORES SET SKITTLES = SKITTLES + THROW_1_ENTRY WHERE GAME_ID = GAME_ID_ENTRY AND TEAM_ID = TID AND FRAME_ID = (FID - 2); END; END IF; -- Ну и, наконец, обновляется текущий фрейм. UPDATE GAME_SCORES SET THROW_1 = THROW_1_ENTRY, THROW_2 = THROW_2_ENTRY, SKITTLES = (THROW_1_ENTRY + THROW_2_ENTRY) WHERE GAME_ID = GAME_ID_ENTRY AND FRAME_ID = FID AND TEAM_ID = TID; END; ELSE BEGIN END; END IF; END;
END IF; CLOSE EMPTY; END;
|
Эта процедура описывает логику начисления очков в боулинге. Мне нужно, чтобы эта процедура в 1-10 фреймах работала как обычно, а потом проверяла, нужен ли 11 и 12 фреймы, а если он не нужен в, допустим, TEAM_ID = 1, то рассматривала бы сразу следующую команду, т.е. брала следующий TEAM_ID из курсора. Как видите, в последнем ELSE ничего нет, не знаю как это сделать. :( Это сообщение отредактировал(а) kvadrokub - 11.10.2010, 04:07
|