1
resposta

[Dúvida] Proposta de resolução do exercício.

Fiz a minha sp um pouco diferente da sugestão do exercício. Não declarei dois limites de crédito (DECLARE LIMITECREDITO FLOAT; e DECLARE LIMITECREDITOACUM FLOAT;). Porém cheguei no mesmo resultado.

Poderiam me dizer porquê seria necessário declarar o "LIMITECREDITOACUM FLOAT; " ? Agradeço se puderem responder.

Meu código:

CREATE DEFINER=`root`@`localhost` PROCEDURE `Limite_Creditos`()
BEGIN
    declare fim_do_cursor int default 0;
    declare vTotalCredito int;
    declare CursorLimiteCreditos cursor for select sum(limite_de_credito) from clientes;
    declare continue handler for not found set fim_do_cursor = 1;
Open CursorLimiteCreditos;
    While  fim_do_cursor = 0
    Do
        fetch CursorLimiteCreditos into vTotalCredito;
            if fim_do_cursor = 0 then
             select vTotalCredito;
            end if;
    end while;
close CursorLimiteCreditos;
END
1 resposta

Oi, Ingrid! Tudo bem?

Desde já peço desculpas pela demora em retornar.

O tipo de dado float foi escolhido para a variável LIMITECREDITOACUM por conta da coluna LIMITE_DE_CREDITO (da tabela de clientes), que também possui o mesmo tipo — e como iremos somar seus valores até chegar no total, é interessante que haja uma consistência nas manipulações feitas. Além disso, vale ressaltar que ambas variáveis fazem referência a dinheiro, logo, é importante a utilização de algum formato que permita a existência de casas decimais, como o float.

Nesse caso em específico, não houve problemas na execução da stored procedure, já que todos os limites de crédito não tinham centavos. No entanto, pensando em um cenário real, é recomendado não utilizar o tipo INT para números que possuem algum valor monetário.

Sabendo disso, caso fôssemos reescrever o script que você compartilhou, chegaríamos no seguinte resultado:

CREATE DEFINER=`root`@`localhost` PROCEDURE `Limite_Creditos`()
BEGIN
    declare fim_do_cursor int default 0;
    declare vTotalCredito float;
    declare CursorLimiteCreditos cursor for select sum(limite_de_credito) from tabela_de_clientes;
    declare continue handler for not found set fim_do_cursor = 1;
Open CursorLimiteCreditos;
    While  fim_do_cursor = 0
    Do
        fetch CursorLimiteCreditos into vTotalCredito;
            if fim_do_cursor = 0 then
             select vTotalCredito;
            end if;
    end while;
close CursorLimiteCreditos;
END

Observe que a única alteração foi a mudança do tipo de dado da variável vTotalCredito, que passou de INT para FLOAT.

Espero ter ajudado, Ingrid. Fico à disposição caso surjam novas dúvidas.

Abraços!

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