Stored procedure loop

0

I put this procedure, it makes the query inside the cursor right, but when I give select in SPA_VALOR_ACOMODACAO , it returns 0, which was set before loop_duracao . It looks like it's not entering loop_duracao . What would it 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;
    
asked by anonymous 14.09.2015 / 21:08

1 answer

0

I do not know this syntax, what is the SQL language?

If you execute the following select:

select 8 + null

You will see that the value will equal null, are you sure that no null is coming in SPV_VALOR_PERIODO ?

A single null value will void the entire account, you can try using COALESCE:

SPA_VALOR_ACOMODACAO = SPA_VALOR_ACOMODACAO + COALESCE(SPV_VALOR_PERIODO,0);

Also check the output data, have data format DOUBLE(20,2) , try with another type to see if this is not the problem.

    
16.10.2015 / 20:00