1
resposta

[Dúvida] Dúvida sobre a resposta

Olá, bom dia. Tenho uma dúvida sobre a resolução.

Acrescentando o IF, da resposta do professor, código abaixo, a resposta fica : 3838320.

IF fim_do_cursor = 0 THEN
SET FATURAMENTOACUM = FATURAMENTOACUM + (QUANTIDADE * PRECO);
END IF;

Porém sem o IF do código acima, a resposta fica: 3838950.

Acredito que com o IF do professor, fica faltando uma iteração no laço WHILE, para o resultado ficar menor com o IF.


DELIMITER $$

DROP PROCEDURE IF EXISTS Mais_Um_Campo$$

CREATE PROCEDURE Mais_Um_Campo(mes INT, ano INT)
BEGIN

    DECLARE vQuantidade INT;
    DECLARE vPreco FLOAT;
    DECLARE vFaturamentoTotal FLOAT DEFAULT 0;

    DECLARE fim_do_cursor BOOLEAN DEFAULT FALSE;

    DECLARE c CURSOR FOR 
                            SELECT INF.QUANTIDADE, INF.PRECO FROM itens_notas_fiscais INF
                                INNER JOIN notas_fiscais NF ON NF.NUMERO = INF.NUMERO
                                WHERE MONTH(NF.DATA_VENDA) = mes AND YEAR(NF.DATA_VENDA) = ano;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim_do_cursor = TRUE;
    OPEN c;
    WHILE fim_do_cursor IS FALSE
    DO

        FETCH c INTO vQuantidade, vPreco;
        SET vFaturamentoTotal = (vFaturamentoTotal + (vQuantidade * vPreco));


    END WHILE;
    CLOSE c;

    SELECT vFaturamentoTotal AS 'Faturamento Total';

END$$
DELIMITER ;

1 resposta

Oi Breno, tudo bem?

Essa diferença é porque quando o bloco IF está presente, a atualização da variável FATURAMENTOACUM ocorre somente se o cursor ainda não atingiu o final, ou seja, se há mais dados para serem lidos. Logo, apenas valores válidos de QUANTIDADE e PRECO são somados ao faturamento acumulado.

Sem o bloco IF, a atualização da variável FATURAMENTOACUM acontece em todas as iterações do laço WHILE, mesmo na última iteração em que o cursor já atingiu o final. O problema é que ao fazer isso, pode-se resultar na adição de valores inválidos à variável FATURAMENTOACUM, pois QUANTIDADE e PRECO podem ser NULL ou inesperados quando o cursor não tem mais dados válidos para serem lidos.

Portanto, para garantir que apenas valores válidos sejam somados ao faturamento acumulado, é importante verificar se o cursor ainda tem dados a serem lidos antes de atualizar a variável FATURAMENTOACUM, através do IF.

Espero ter esclarecido.

Qualquer dúvida, fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!