Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Está dando erro naq procedure

SELECT * FROM reservas;

-- 1000 > 2;
-- '1000' < '2';

SELECT reserva_id, CAST(reserva_id AS UNSIGNED) FROM reservas;
SELECT MAX(reserva_id), MAX(CAST(reserva_id AS UNSIGNED)) FROM reservas;
SELECT CAST(MAX(CAST(reserva_id AS UNSIGNED)) + 1 AS CHAR)FROM reservas;

USE insight_places;
DROP PROCEDURE IF EXISTS insight_places.novoAluguel_44;
DELIMITER $$
USE insight_places $$
CREATE DEFINER=root@localhost PROCEDURE novoAluguel_44
(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 INT;
DECLARE vPrecoTotal DECIMAL(10,2);
DECLARE vMensagem VARCHAR(200);
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 = 'Este cliente não pode ser usado para incliuir no aluguel porque não existe.';
SELECT vMensagem;
WHEN vNumCliente = 1 THEN
SELECT CAST(MAX(CAST(reserva_id AS UNSIGNED)) + 1 AS CHAR)INTO vAluguel FROM reservas;
CALL calculaDataFinal_43(vDataInicio, vDataFinal, vDias);
SET vPrecoTotal = vDias * vPrecoUnitario;
SELECT cliente_id INTO vCliente FROM clientes WHERE nome = vClienteNome;
INSERT INTO reservas (reserva_id, cliente_id, hospedagem_id, data_inicio,
data_fim, preco_total)
VALUES (vAluguel, vCliente, vHospedagem, vDataInicio,
vDataFinal, 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 incliuir no aluguel porque não existe.';
SELECT vMensagem;
-- Obtém o ID do cliente
SELECT cliente_id
INTO vCliente
FROM clientes
WHERE nome = vClienteNome;
END CASE;
END$$
DELIMITER ;

CALL novoAluguel_44('Lívia Fogaça', '8635', '2023-05-15', 5, 45);

0 41 09:54:05 CALL novoAluguel_44('Lívia Fogaça', '8635', '2023-05-15', 5, 45) Error Code: 2013. Lost connection to MySQL server during query 30.000 sec

1 resposta

Olá, Ítalo!

Sobre a procedure no MySQL e o erro de perda de conexão com o servidor, o "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.

Antes de tudo teste, 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.

Execute novamente e observe se roda normalmente. Caso o erro persista, faça estes testes separadamente para localizar exatamente onde a execução para:

  1. Verifique se o cliente existe apenas uma vez:

SELECT COUNT(*) FROM clientes WHERE nome = 'Livia Fogaca';

Esse comando confirma se apenas um registro será encontrado.

  1. Teste a procedure de cálculo da data isoladamente:
CALL calculaDataFinal_43('2023-05-15', @dataFinal, 5);
SELECT @dataFinal;

Esse teste verifica se a procedure retorna a data corretamente.

  1. Confira se o próximo reserva_id está sendo gerado:
SELECT CAST(MAX(CAST(reserva_id AS UNSIGNED)) + 1 AS CHAR) FROM reservas;

Esse comando valida o valor que será utilizado no INSERT.

No momento, o trecho da novoAluguel_44 não indica um erro de sintaxe que justifique a perda da conexão. Tudo indica que o problema está sendo provocado pela execução da calculaDataFinal_43 ou por alguma configuração do servidor MySQL que encerra consultas demoradas.

Espero que uma dessas sugestões dê certinho para resolver o problema. Qualquer dúvida estaremos aqui!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!