1
resposta

[Projeto] Mão na massa - implementando a Stored Procedure de inclusão do aluguel

Stored Procedure inclusao_cliente_43

CREATE DEFINER=`root`@`localhost` PROCEDURE `inclusao_cliente_43`(vAluguel VARCHAR(10), vClienteNome VARCHAR(150), vHospedagem VARCHAR(10), 
     vDataInicio DATE, vDataFinal DATE, vDias INTEGER, vPrecoUnitario DECIMAL(10, 2))
BEGIN
    DECLARE vPrecoTotal DECIMAL(10,2);
    DECLARE vCliente VARCHAR(10);
    
    SET vPrecoTotal = vDias * vPrecoUnitario;
    SELECT cliente_id INTO vCliente FROM clientes WHERE nome = vClienteNome;
    INSERT INTO alugueis VALUES (vAluguel, vCliente, vHospedagem, vDataInicio, vDataFinal, vPrecoTotal);
END

stored procedure novoaluguel_43_desafio

USE `insight_places`;
DROP procedure IF EXISTS `insight_places`.`novoaluguel_43_desafio`;
;

DELIMITER $$
USE `insight_places`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `novoaluguel_43_desafio`
    (vAluguel varchar(10), vClienteNome varchar(150), vHospedagem varchar(10), vDataInicio date,
     vDias INTEGER, vPrecoUnitario decimal(10, 2))
BEGIN
    DECLARE vCliente VARCHAR(10);
    DECLARE vDataFinal DATE;
    DECLARE vNumCliente INTEGER;
    DECLARE vPrecoTotal DECIMAL(10,2);
    DECLARE vMensagem VARCHAR(100);
    DECLARE vErro INT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1 vErro = MYSQL_ERRNO;
        IF vErro = 1452 THEN
            SET vMensagem = 'Problema de chave estrangeira associado a alguma entidade da base.';
        ELSEIF vErro = 1062 THEN
            SET vMensagem = 'Registro já existe na base.';
        ELSE
            SET vMensagem = CONCAT('Erro não mapeado. Código: ', vErro);
        END IF;
        SELECT vMensagem;
    END;
    
    SET vNumCliente = (SELECT COUNT(*) FROM clientes WHERE nome = vClienteNome);
    CASE
        WHEN vNumCliente = 0 THEN
            SET vMensagem = 'Este cliente não está cadastrado na base de dados';
        WHEN vNumCliente = 1 THEN
            CALL calcula_data_final_43(vDataInicio, vDataFinal, vDias);
            CALL inclusao_cliente_43(vAluguel, vClienteNome, vHospedagem, vDataInicio, vDataFinal, vDias, vPrecoUnitario);
            SET vMensagem = 'Aluguel incluído com sucesso na base de dados.';
        WHEN vNumCliente > 1 THEN
            SET vMensagem = 'Este cliente não pode ser usado para incluir o aluguel pelo nome.';
    END CASE;
    SELECT vMensagem;
END$$

DELIMITER ;
1 resposta

Ei! Tudo bem, Vinicius?

Seu projeto está bem estruturado e segue certinho a lógica proposta na atividade. Você organizou bem as variáveis, utilizou a validação do cliente antes da inserção e chamou corretamente as procedures responsáveis pelo cálculo da data final e pela inclusão do aluguel.

Achei interessante a implementação do handler de exceções, tratando erros comuns como chave estrangeira e registros duplicados. Isso deixa a procedure mais robusta e próxima de um cenário real de banco de dados.

Parabéns pela solução bem aplicada! Demonstra um bom entendimento de validação, reutilização de procedures e tratamento de erros no MySQL. Muito bom trabalho!

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