1
resposta

Mensagem

USE `insight_places`;
DROP PROCEDURE IF EXISTS `insight_places`.`novoAluguel_34`;
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `novoAluguel_34`
(vAluguel VARCHAR(10), vClienteNome VARCHAR(150), vHospedagem VARCHAR(10), vDataInicio DATE, vDataFinal DATE, vPrecoUnitario DECIMAL(10,2))
BEGIN
    DECLARE vCliente VARCHAR(10);
    DECLARE vDias INTEGER DEFAULT 0;
    DECLARE vNumCliente INTEGER;
    DECLARE vPrecoTotal DECIMAL(10,2);
    DECLARE vMensagem VARCHAR(100);

    -- Verifica se há mais de um cliente com o mesmo nome
    SET vNumCliente = (SELECT COUNT(*) FROM clientes WHERE nome = vClienteNome);
    
    CASE
        WHEN vNumCliente > 1 THEN 
            SET vMensagem = 'Este cliente não pode ser usado para incluir o aluguel pelo nome.';
            SELECT vMensagem AS MensagemErro;
        
        WHEN vNumCliente = 0 THEN
            SET vMensagem = 'Este cliente não pode ser usado para incluir o aluguel porque não existe.';
            SELECT vMensagem AS MensagemErro;
        
        ELSE 
            -- Calcula a diferença de dias
            SET vDias = DATEDIFF(vDataFinal, vDataInicio);

            -- Calcula o preço total
            SET vPrecoTotal = vDias * vPrecoUnitario;

            -- Obtém o ID do cliente pelo nome
            SELECT cliente_id INTO vCliente FROM clientes WHERE nome = vClienteNome LIMIT 1;

            -- Insere o novo aluguel
            INSERT INTO alugueis (aluguel_id, cliente_id, hospedagem_id, data_inicio, data_fim, preco_total)
            VALUES (vAluguel, vCliente, vHospedagem, vDataInicio, vDataFinal, vPrecoTotal);

            -- Define a mensagem de sucesso
            SET vMensagem = 'Aluguel incluído na base com sucesso.';
            SELECT vMensagem AS MensagemSucesso;
            
            -- Seleciona o aluguel recém-inserido junto com o nome do cliente
            SELECT a.*, c.nome AS Nome_Cliente
            FROM alugueis a
            JOIN clientes c ON a.cliente_id = c.cliente_id
            WHERE a.aluguel_id = vAluguel;
    END CASE;
END$$

DELIMITER ;

CALL novoAluguel_34('10007','Victorino Vila','8635','2023-03-30','2023-04-04',40);
CALL novoAluguel_34('10007','Júlia Pires','8635','2023-03-30','2023-04-04',40);
CALL novoAluguel_34('10007','Luana Moura','8635','2023-03-30','2023-04-04',40);

DELETE FROM alugueis WHERE aluguel_id = '10007';
 

Ao chamar a procedure: CALL novoAluguel_34('10007','Luana Moura','8635','2023-03-30','2023-04-04',40); eu nao tenho a mensagem definida no meu SET: 'Aluguel incluído na base com sucesso.'; , apenas a inclusao no banco

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oii, Thainá! Como você está?

Isso pode acontecer por alguns motivos, vamos verificar os principais.

Nesse caso, a procedure está retornando com múltiplos result sets, sendo um para mensagem e outro para os dados. Como sugestão, você pode modificar a procedure para incluir a mensagem juntos com os dados do aluguel para que possam retornar juntos.

Segue um exemplo do código:

SET vMensagem = 'Aluguel incluído na base com sucesso.';

-- Seleciona o aluguel recém-inserido junto com o nome do cliente e a mensagem de sucesso
SELECT a.*, c.nome AS Nome_Cliente, vMensagem AS Mensagem
FROM alugueis a
JOIN clientes c ON a.cliente_id = c.cliente_id
WHERE a.aluguel_id = vAluguel;

Outra alternativa é, por padrão, o Workbench mostra o último result set. Porém conseguimos navegar entre diferentes result set pelas abas enumeradas Result1, Result 2 e assim por diante. Então verifique se o retorno não está em uma delas.

Espero que as sugestões te ajude. Qualquer dúvida, conte conosco.

Bons estudos, Thainá!