Stored Procedure loop

Asked

Viewed 123 times

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;

1 answer

1

I don’t know this syntax, which SQL language is this ?

If you run the following select:

select 8 + null

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

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

SPA_VALOR_ACOMODACAO = SPA_VALOR_ACOMODACAO + COALESCE(SPV_VALOR_PERIODO,0);

Also check the output data, has a data formatting DOUBLE(20,2), try with another guy to see if this is not the problem.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.