1
I built this project, it makes the query inside the cursor right, but when I select SPA_VALOR_ACOMODACAO
, it returns the 0, which was set before the loop_duracao
. Looks like it’s not getting into the loop_duracao
. What would be?
DROP PROCEDURE IF EXISTS SP_CALCULA_VALOR_ACOMODACAO;
DELIMITER //
CREATE PROCEDURE SP_CALCULA_VALOR_ACOMODACAO(IN SPA_CURSO_ID INT, IN SPA_DURACAO INT, SPA_IDADE INT, IN SPA_DATA DATE, OUT SPA_VALOR_ACOMODACAO DOUBLE(20,2))
BEGIN
-- DECLARANDO VARIAVEIS INTERNAS DA PROCEDURE;
DECLARE SPV_VALOR_NORMAL, SPV_VALOR_TEMPORADA, SPV_VALOR_PERIODO DOUBLE(20,2) DEFAULT NULL;
DECLARE CURSOR_FIM, LOOP_POSICAO, SPV_TEMPORADA INT DEFAULT NULL;
DECLARE SPV_DATA_PROJETADA DATE DEFAULT NOT NULL;
-- DECLARANDO O CURSOR DE ACORDO COM OS CRITERIOS ATENDIDOS;
DECLARE cursor_acomodacao CURSOR FOR SELECT valor,valor_temporada FROM `curso_navigation` WHERE curso_id = SPA_CURSO_ID AND SPA_IDADE BETWEEN idade_de AND idade_ate ORDER BY valor LIMIT 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET CURSOR_FIM = 1;
OPEN cursor_acomodacao;
loop_acomocadao: LOOP
FETCH cursor_acomodacao INTO SPV_VALOR_NORMAL,SPV_VALOR_TEMPORADA;
IF CURSOR_FIM = 1 THEN
LEAVE loop_acomocadao;
END IF;
SET SPA_VALOR_ACOMODACAO = 0;
IF SPV_VALOR_TEMPORADA IS NULL THEN
SET SPV_VALOR_TEMPORADA = SPV_VALOR_NORMAL;
END IF;
SET LOOP_POSICAO = 0;
loop_duracao: LOOP
IF LOOP_POSICAO = SPA_DURACAO THEN
SET CURSOR_FIM = 1;
LEAVE loop_duracao;
END IF;
-- data para o dia de checkin;
SET SPV_DATA_PROJETADA = DATE_ADD(SPA_DATA,INTERVAL LOOP_POSICAO WEEK);
-- SETA COMO NÃO TEMPORADA
-- TESTA DOMINGO
SET SPV_TEMPORADA = 0;
CALL SP_IS_TEMPORADA(SPA_CURSO_ID, FN_DATE_TO_WEEKDAY(SPV_DATA_PROJETADA, 0), NULL, SPV_TEMPORADA);
-- Caso domingo não é TEMPORADA, testa Sabado;
IF SPV_TEMPORADA IS NULL THEN
CALL SP_IS_TEMPORADA(SPA_CURSO_ID, FN_DATE_TO_WEEKDAY(SPV_DATA_PROJETADA, 6), NULL, SPV_TEMPORADA);
END IF;
-- se nenhum é temporada, joga para o valor normal;
IF SPV_TEMPORADA IS NULL THEN
SET SPV_VALOR_PERIODO = SPV_VALOR_NORMAL;
ELSE
SET SPV_VALOR_PERIODO = SPV_VALOR_TEMPORADA;
END IF;
-- SOMA O VALOR TOTAL DA ACOMODACAO;
SET SPA_VALOR_ACOMODACAO = SPA_VALOR_ACOMODACAO + SPV_VALOR_PERIODO;
-- pula posicao;
SET LOOP_POSICAO = LOOP_POSICAO + 1;
END LOOP loop_duracao;
END LOOP loop_acomocadao;
CLOSE cursor_acomodacao;
END//
DELIMITER ;
SET @VALOR = 0;
CALL SP_CALCULA_VALOR_ACOMODACAO(1540,4,18,'2015-09-01',@VALOR);
SELECT @VALOR;