Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Diferença entre resultados

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?

4 respostas

A diferença entre a minha procedure e a da resolução do exercício é que eu inverti a ordem de inclusão das variáveis no comando FETCH, agora as duas retornam o mesmo valor. Mas mesmo assim o valor ainda é diferente do valor da consulta pelo SELECT.

solução!

Olá Marcelo!

Pelo que eu pude entender, essa diferença está acontecendo por causa da utilização do ROUND, perceba que se você executar o seguinte comando:

SELECT sum(round(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;

Vai obter o seguinte valor: '3838367', porém se você alterar essa ultima stored procedure que você monstrou para:

CREATE DEFINER=`admin`@`localhost` PROCEDURE `mais_um_campo_teste_meu`()
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 + (round(QUANTIDADE * PRECO));
        END IF;
    END WHILE;
    CLOSE c;

    SELECT FATURAMENTOACUM;
END

Vai retornar o seguinte valor: '3838370', assim a diferença é de apenas 3, essa diferença é criada pelo fato da utilização do ROUND, ele vai sempre tentar arredondar o número pra deixá-lo exato, e ele pode está trocando, aumentando ou diminuindo um ou outro número gerando essa diferença, então, acho que para você ter um valor mais próximo do real, você deveria indicar mais casas decimais, ou nem usar o round.

Espero que tenha ajudado!

Olá, Jonilson. Ajudou sim, obrigado!

Show de Bola Marcelo!

Já que ajudou, marca esse tópico como solucionado por favor, para que se outros colegas tiveram a mesma dúvida já saberem a solução!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software