1
resposta

Minha Resposta (RESULTADO DIFERENTE)

Bom dia, boa tarde, boa noite eu no ex 5-7 eu o resolvi de 2 maneiras porem nos 2 casos nos 3 se contarmos a resposta do professor o resultado é diferente , alguem saberia me dizer o porque disso ? nao consigo entender isso sozinho

Primeira resposta:

CREATE DEFINER=`root`@`localhost` PROCEDURE `mais_um_campo`()
BEGIN
    DECLARE vQuantidade INT DEFAULT 0;
    DECLARE vPreco FLOAT DEFAULT 0;
    DECLARE vSOMA FLOAT DEFAULT 0;

    DECLARE c CURSOR FOR SELECT QUANTIDADE, PRECO, ROUND(SUM(QUANTIDADE * PRECO),0) AS FATURAMENTO
    FROM itens_notas_fiscais INF INNER JOIN notas_fiscais NF 
    ON  INF.NUMERO = NF.NUMERO 
    WHERE MONTH(NF.DATA_VENDA) = 1 AND YEAR(NF.DATA_VENDA) = 2017;
    OPEN c;
    FETCH c INTO vQUANTIDADE, vPreco, vSOMA;
    SELECT vQUANTIDADE AS QUANTIDADE, vPreco as PRECO, vSOMA as FATURAMENTO;
END

Segunda Resposta:

CREATE DEFINER=`root`@`localhost` PROCEDURE `mais_um_campo_looping`()
BEGIN
    DECLARE vQUANTIDADE INT DEFAULT 0;
    DECLARE vPRECO FLOAT DEFAULT 0;
    DECLARE vFATURAMENTO FLOAT DEFAULT 0;
    DECLARE vCheck INT DEFAULT 0;

    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 vCheck = 1;

    OPEN c;

    WHILE vCheck = 0
    DO 
        IF vCheck = 0 THEN
            FETCH c INTO vQUANTIDADE, vPRECO;
            set vFATURAMENTO = vFATURAMENTO + (vQUANTIDADE * vPRECO);
        END IF;
    END WHILE;
    SELECT vQUANTIDADE, vPRECO, vFATURAMENTO;
END

e Resposta do Professor

CREATE DEFINER=`root`@`localhost` PROCEDURE `R_Limite_creditos`()
BEGIN
DECLARE LIMITECREDITO FLOAT;
DECLARE LIMITECREDITOACUM FLOAT;
DECLARE fim_do_cursor INT;
DECLARE c CURSOR FOR SELECT LIMITE_DE_CREDITO FROM Tabela_de_Clientes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim_do_cursor = 1;
SET fim_do_cursor = 0;
SET LIMITECREDITOACUM = 0;
SET LIMITECREDITO = 0;
OPEN c;
WHILE fim_do_cursor = 0
DO
FETCH c INTO LIMITECREDITO;
    IF fim_do_cursor = 0 THEN
        SET LIMITECREDITOACUM = LIMITECREDITOACUM + LIMITECREDITO;
    END IF;
END WHILE;
SELECT LIMITECREDITOACUM;
CLOSE c;
END
1 resposta

Oii Jhony. Tudo beleza?

Desculpe por demorar a te responder.

Compreender a lógica por trás dos códigos é bastante desafiador!

Cada um desses códigos apresenta uma pequena diferença na construção que modifica abordagem e a lógica operada. Assim, o resultado obtido difere em cada um deles.

O primeiro código usa um cursor para buscar as informações de quantidade, preço e faturamento total das notas fiscais de um mês e ano específicos. A cláusula FETCH, nesse caso, obtém apenas a primeira linha de resultados e exibe as informações diretamente.

O segundo código também utiliza um cursor para buscar as informações de quantidade e preço das notas fiscais de um mês e ano específicos. No entanto, ele utiliza um loop WHILE e um manipulador CONTINUE HANDLER e percorre todas as linhas do cursor. Assim, os valores são acumulados e calculados no final do looping.

Já o código do professor traz semelhanças e diferenças em relação ao seu segundo código. O código do professor, por exemplo, inicializa as variáveis com valores padrão, o que é uma boa prática para evitar comportamentos inesperados. Além disso, no seu código o comando FETCH é colocado dentro do IF, e o do professor, fora. Essa diferença pode afetar o fluxo de execução e a atualização das variáveis. Já a verificação IF vCheck = 0 ocorre antes de buscar um novo registro do cursor, o que pode levar a diferença no resultado apresentado.

Com prática e dedicação esse tipo de interpretação de códigos fica menos complexa. Espero ter ajudado um pouquinho a esclarecer sua dúvida!

Abraços.