1
resposta

Incorrect decimal value

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_comparativo_vendas_case`(vdata1 date,vdata2 date)
BEGIN
/*
Esta procedure compara as vendas em duas datas (Estas duas datas serão parâmetros da SP).
Se a variação percentual destas vendas for maior que 10% a resposta deve ser "Verde".
Se for entre -10% e 10% deve retornar "Amarela". Se o retorno form menor que -10% deve retornar "Vermelho".
*/

declare vresultado1 decimal(10,2);
declare vresultado2 decimal(10,2);
declare vvariacao decimal(10,2);

/*
Obtém o valor total das vendas na data vdata1.
*/
SELECT format(SUM(B.QUANTIDADE * B.PRECO),2) INTO  vresultado1 FROM 
NOTAS A INNER JOIN ITENS_NOTAS B
ON A.NUMERO = B.NUMERO
WHERE A.DATA_VENDA = vdata1;

/*
Obtém o valor total das vendas na data vdata2.
*/
SELECT format(SUM(B.QUANTIDADE * B.PRECO),2) INTO vresultado2  FROM 
NOTAS A INNER JOIN ITENS_NOTAS B
ON A.NUMERO = B.NUMERO
WHERE A.DATA_VENDA = vdata2;

/*
Calcula a variação percentual entre as duas datas.
*/
set vvariacao = ((round(vresultado1,2) / round(vresultado2,2)) -1 ) * 100;
CASE
    when vvariacao >= 10 then select "Verde";
    when vvariacao >= -10 and vvariacao < 10 then select  "Amarelo";
    else select "Vermelho";
end case;

/*
Retorna o valor total das vendas em cada data, bem como a variação percentual entre as duas datas.
*/

END
call sp_comparativo_vendas_case('2015-01-01','2015-11-25')	

Error Code: 1366. Incorrect decimal value: '94,135.10' for column 'vresultado1' at row 1 0.016 sec

Estou recebendo esse erro, alguem pode me dá uma luz?

1 resposta

Oi, Vagner! Tudo bem contigo?

O erro mencionado sugere que o valor formatado como 94,135.10 (que tem uma vírgula como separador de milhar e ponto como separador decimal) não pode ser inserido em uma coluna (ou variável) do tipo decimal.

Este problema acontece devido ao uso da função FORMAT(). Ao usá-la, tornamos o valor a ser armazenado em vresultado1 uma string. Contudo, nesta stored procedure precisamos trabalhar com dados numéricos.

Sabendo disso, basta remover a função FORMAT() dos SELECTs referentes às variáveis vresultado1 e vresultado2, desta forma:

/*
Obtém o valor total das vendas na data vdata1.
*/
SELECT SUM(B.QUANTIDADE * B.PRECO) INTO  vresultado1 FROM 
NOTAS A INNER JOIN ITENS_NOTAS B
ON A.NUMERO = B.NUMERO
WHERE A.DATA_VENDA = vdata1;

/*
Obtém o valor total das vendas na data vdata2.
*/
SELECT SUM(B.QUANTIDADE * B.PRECO) INTO vresultado2  FROM 
NOTAS A INNER JOIN ITENS_NOTAS B
ON A.NUMERO = B.NUMERO
WHERE A.DATA_VENDA = vdata2;

Após realizar tal modificação, a stored procedure deve funcionar normalmente, retornando cores específicas conforme o resultado de vvariacao.

Espero que dê tudo certo, Vagner! Caso surjam outras dúvidas, fico à disposição.

Um abraço.

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

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