Tive uma dúvida quanto a resultado da procedure. Após a criação, eu resolvi testar se o resultado era o mesmo quando eu tentava obter o faturamento pelo comando SELECT normal. Pra isso eu fiz o seguinte comando:
SELECT round(sum(INF.QUANTIDADE*INF.PRECO)) FROM ITENS_NOTAS_FISCAIS INF
INNER JOIN NOTAS_FISCAIS NF ON NF.NUMERO = INF.NUMERO
WHERE MONTH(NF.DATA_VENDA) = 1 AND YEAR(NF.DATA_VENDA) = 2017;
Esse resultado me retornou o valor 3838334. Mas a seguinte procedure:
CREATE DEFINER=`root`@`localhost` PROCEDURE `mais_um_campo`()
BEGIN
DECLARE fim INT DEFAULT 0;
DECLARE vPreco FLOAT;
DECLARE vFaturamento FLOAT DEFAULT 0;
DECLARE vQuantidade INT;
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) = 1 AND YEAR(NF.DATA_VENDA) = 2017;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim = 1;
OPEN c;
WHILE fim = 0
DO
FETCH c INTO vPreco, vQuantidade;
IF fim = 0 THEN
SET vFaturamento = vFaturamento + (vQuantidade*vPreco);
END IF;
END WHILE;
CLOSE c;
SELECT vFaturamento;
END
Está me retornando o valor 3832560. Que, por sua vez, também é diferente do valor da procedure da resolução do exercício (após uma correção de IF):
CREATE DEFINER=`root`@`localhost` PROCEDURE `mais_um_campo2`()
BEGIN
DECLARE QUANTIDADE INT;
DECLARE PRECO FLOAT;
DECLARE FATURAMENTOACUM FLOAT;
DECLARE fim_do_cursor INT;
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) = 1 AND YEAR(NF.DATA_VENDA) = 2017;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim_do_cursor = 1;
OPEN c;
SET fim_do_cursor = 0;
SET FATURAMENTOACUM = 0;
WHILE fim_do_cursor = 0
DO
FETCH c INTO QUANTIDADE, PRECO;
IF fim_do_cursor = 0 THEN
SET FATURAMENTOACUM = FATURAMENTOACUM + (QUANTIDADE * PRECO);
END IF;
END WHILE;
CLOSE c;
SELECT FATURAMENTOACUM;
END
Que retorna o valor 3838320. Qual o motivo dessa diferença de valores?