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