1
resposta

Tratamento de erro 1318

Na minha primeira tentativa de rodar o código acabei passando apenas um parametro. Isso retornou um erro 1318. Tentei criar uma condição de tratamento de erro, mas ela não funciona. Tentei criar com If, com case e sem nenhum dos dois. Ocorre que não importa, simplesmente ele acusa o erro.

Existem formas diferentes de tratar esses erros?

CREATE DEFINER=`root`@`localhost` PROCEDURE `Comparativo_Vendas_Case_Cond`(Variavel01 date, Variavel02 date)
BEGIN
    declare vMensagem varchar(30);
    declare vTOTAL_VENDA01 float;
    declare vTOTAL_VENDA02 float;
    declare vResultado float;
    declare msgErro varchar(30);
    declare continue handler for 1318  set msgErro = 'parametros incorretos';

            SELECT SUM(B.QUANTIDADE * B.PRECO) into vTOTAL_VENDA01 FROM 
        NOTAS_FISCAIS A INNER JOIN ITENS_NOTAS_FISCAIS B
        ON A.NUMERO = B.NUMERO
        WHERE A.DATA_VENDA = Variavel01;

           SELECT SUM(B.QUANTIDADE * B.PRECO) into vTOTAL_VENDA02 FROM 
        NOTAS_FISCAIS A INNER JOIN ITENS_NOTAS_FISCAIS B
        ON A.NUMERO = B.NUMERO
        WHERE A.DATA_VENDA = Variavel02;

            set vResultado = ((vTOTAL_VENDA01/vTOTAL_VENDA02)-1)*100;

            Case
            when vResultado > 10 then set vMensagem = 'VERDE';
            when vResultado >= -10 and vResultado <= 10 then set vMensagem = 'Amarela';
            when vResultado < -10 then set vMensagem = 'Vermelho';
            end case;

            select vMensagem, concat('A porcentagem é de: ',vResultado,'%') as Percentual;

    select msgErro;

END
1 resposta

Olá, Alysson, tudo bem?

Peço desculpas pela demora no retorno.

Como o erro retornado foi de número incorreto de argumentos, que é um erro gerado antes de o código da procedure ser executado, o erro não pode ser tratado internamente.

Uma forma de tratar erros que são gerados antes da execução do código da procedure, é quando chamamos a procedure dentro de outro procedimento, como no código abaixo:

DELIMITER //

CREATE PROCEDURE `teste`()
BEGIN
    DECLARE msgErro VARCHAR(30);
    DECLARE CONTINUE HANDLER FOR 1318  SET msgErro = 'parâmetros incorretos';

    CALL Comparativo_Vendas_Case_Cond('20150202');

    SELECT msgErro;
END //

DELIMITER ;

Foi criada uma novo procedimento, onde a procedure Comparativo_Vendas_Case_Cond() é chamada, assim, podemos realizar o tratamento do 1318, dentro da procedure teste.

Espero ter ajudado, qualquer dúvida é só falar e bons estudos!