Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Error code 2013: Lost connection to MySQL server during query

Olá. Realizei os exercícios de aula e não consigo encontrar nenhum erro aparente no código. Quando tento rodar o código, o workbench roda até perder a conexão com o servidor. Porém com qualquer outra chamada mais simples é possivel executar o código pedido. O que pode ter acontecido?

A stored procedure principal:

USE `insight_places`;
DROP procedure IF EXISTS `novoAluguel_v14`;
DELIMITER $$
USE `insight_places`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `novoAluguel_v14`(
    vClienteNome VARCHAR(150), 
    vHospedagem VARCHAR(10), 
    vDataInicio DATE,
    vDias INTEGER, 
    vPrecoUnitario DECIMAL(10,2))
BEGIN
    DECLARE vAluguel VARCHAR(10); 
    DECLARE vCliente VARCHAR(10);
    DECLARE vDataFinal DATE;
    DECLARE vNumCliente INTEGER;
    DECLARE vMensagem VARCHAR(100);
    DECLARE VPrecoTotal DECIMAL(10,2);
    DECLARE EXIT HANDLER FOR 1452
    BEGIN
        SET vMensagem = 'Problema de chave estrangeira associado a alguma entidade da base.';
        SELECT vMensagem;
    END;    
    SET vNumCliente = (SELECT COUNT(*) FROM clientes WHERE nome = vClienteNome);
    CASE 
    WHEN vNumCliente = 0 THEN
        SET vMensagem = 'Cliente não pode ser usado para incluir aluguel, pois não existe.';
        SELECT vMensagem;        
    WHEN vNumCliente = 1 THEN
        SELECT CAST(MAX(CAST(aluguel_id AS UNSIGNED)) + 1 AS CHAR) into vAluguel FROM alugueis;
        CALL CalculaDataFinal_v1 (vDataInicio, vDataFinal, vDias);
        SELECT cliente_id INTO vCliente FROM clientes WHERE nome = vClienteNome;
        CALL inclusao_cliente_v1 (vAluguel, vCliente, vHospedagem, vDataInicio, vDataFinal, vDias, vPrecoUnitario, VPrecoTotal);
        SET vMensagem = 'Aluguel incluido na base com sucesso.';
        SELECT vMensagem;
    WHEN vNumCliente > 1 THEN
        SET vMensagem = 'Este cliente não pode ser usado para incluir o aluguel porque não existe.';
        SELECT vMensagem;
    END CASE;
END$$
DELIMITER ;

A chamada:

CALL novoAluguel_v14('Livia Fogaça', '8635', '2023-05-15', 5, 45);

Stored procedure CalculaDataFinal_v1:

CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculaDataFinal_v1`(INOUT vDataFinal DATE, vDataInicio DATE, vDias INTEGER)
BEGIN
DECLARE vContador INTEGER;
DECLARE vDiaSemana INTEGER;
SET vContador = 1;
SET vDataFinal = vDataInicio;
WHILE vContador < vDias
DO
    SET vDiaSemana = (SELECT DAYOFWEEK(STR_TO_DATE(vDataFinal, '%Y-%m-%d')));
    IF (vDiaSemana <> 7 AND vDiaSemana <> 1) THEN
        SET vContador = vContador + 1;
    END IF; 
    SET vDataFinal = (SELECT vDataFinal + INTERVAL 1 DAY);
END WHILE; 
END

Stored procedure inclusao_cliente_v1:

CREATE DEFINER=`root`@`localhost` PROCEDURE `inclusao_cliente_v1`(
    INOUT vAluguel VARCHAR(10), 
    INOUT vCliente VARCHAR(10), 
    INOUT vHospedagem VARCHAR(10), 
    INOUT vDataInicio DATE, 
    INOUT vDataFinal DATE, 
    vDias INTEGER, 
    vPrecoUnitario DECIMAL(10,2),
    INOUT VPrecoTotal DECIMAL(10,2))
BEGIN
    SET VPrecoTotal = vDias * vPrecoUnitario;
    INSERT INTO alugueis 
    VALUES (vAluguel, vCliente, vHospedagem, vDataInicio, vDataFinal, VPrecoTotal);
END
1 resposta
solução!

Olá Gabriel, tudo certo?

O erro "Error code 2013: Lost connection to MySQL server during query" geralmente ocorre quando a execução de uma query leva muito tempo, fazendo com que a conexão com o servidor seja perdida. Isso pode acontecer devido a várias razões, como a complexidade da query, problemas de rede, ou configurações do servidor.

Notei que no código compartilhado você não especificou o delimitador nas procedure CalculaDataFinal_v1 e inclusao_cliente_v1. Reforço a importância para evitar erros. Ao inserir o delimitador, as procedures foram criadas corretamente, portanto suas query estão corretas.

  • CalculaDataFinal_v1
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculaDataFinal_v1`(INOUT vDataFinal DATE, vDataInicio DATE, vDias INTEGER)
-- código omitido
END WHILE; 
END //

DELIMITER ;
  • inclusao_cliente_v1
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `inclusao_cliente_v1`(
--código omitido
END //


DELIMITER ;

Agora, tente configurar o tempo limite de leitura da conexão DBMS (em segundos). Ele refere-se ao tempo máximo que uma conexão pode esperar para receber dados do servidor de banco de dados.

  • Vá em Edit
  • Em seguida, Preferences
  • SQL Editor
  • DBMS connection read time out

A imagem mostra a janela de preferências do MySQL Workbench. No painel esquerdo, as opções incluem "SQL Editor," "Modeling," e "Others." No painel principal, há configurações de editor de SQL, barra lateral e sessão MySQL, destacando a opção "DBMS connection read timeout interval (in seconds): 600" em um retângulo vermelho.

Aumente o valor que está configurado no seu ambiente. O meu está como 600, você pode testar esse valor.

Espero ter ajudado.

Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!

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