Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Qual a função do INOUT?

No exemplo dado na aula 4 tópico "04 Para saber mais: procedures e funções" no argumento iniciado na criação da procedure tem o 'INOUT'. Eu não sei o que faz e não entendi qual a função dele ali. Imagino que já tenha sido explicado em outro momento, mas provavelmente eu deixei passar...

DELIMITER $$

CREATE PROCEDURE AplicarDescontoNaCompra(INOUT valorTotal DECIMAL)
BEGIN
    DECLARE desconto DECIMAL;
    
    -- Chama a função CalcularDesconto e armazena o resultado em desconto
    SET desconto = CalcularDesconto(valorTotal);
    
    -- Aplica o desconto ao valor total
    SET valorTotal = valorTotal - desconto;
END$$

DELIMITER ;
3 respostas

Oi, Érika! Tudo bem com você?

O INOUT é um tipo de parâmetro que permite que uma variável seja passada para uma procedure, podendo ser lida e modificada dentro dela. Isso significa que você pode tanto enviar um valor para a procedure quanto receber um valor de volta após sua execução. Em outras palavras, ele funciona como um parâmetro de entrada e saída ao mesmo tempo.

No exemplo que você trouxe, funciona assim:

  • O valor inicial de valorTotal é passado para a procedure.
  • A procedure calcula um desconto usando o valor que foi passado.
  • O valor de valorTotal é atualizado ao subtrair o desconto calculado.
  • Quando a procedure termina, o valorTotal que foi alterado pode ser usado fora dela, retornando o novo valor.
  • Por exemplo, se você chamar a procedure com um valorTotal de 100, e a função CalcularDesconto retornar um desconto de 10, a procedure irá subtrair o desconto do valorTotal, resultando em 90. Esse valor de 90 será o novo valor de valorTotal após a execução da procedure.

Vamos à prática entender ainda melhor. O primeiro passo é criar uma procedure que calcula o desconto de 10% diretamente no código:

DELIMITER $$

CREATE PROCEDURE AplicarDescontoNaCompra(INOUT valorTotal DECIMAL)
BEGIN
    DECLARE desconto DECIMAL;

    -- Calcula o desconto de 10% diretamente
    SET desconto = valorTotal * 0.10;
    
    -- Aplica o desconto ao valor total
    SET valorTotal = valorTotal - desconto;
END$$

DELIMITER ;

Agora, precisamos testar a procedure que criamos:

-- Declara uma variável para o valor total
SET @valorTotal = 100.00;  

-- Chama a procedure
CALL AplicarDescontoNaCompra(@valorTotal);

-- Exibe o novo valor total
SELECT @valorTotal AS NovoValorTotal;

Perceba que ao executar o código, o valor total é atualizado para refletir o desconto aplicado.

Imagem que mostra o resultado de 90 após a execução do código

Dessa forma, usando o INOUT, conseguimos atualizar a variável @valorTotal fora da procedure. Isso é vantajoso porque permite que a mesma variável seja modificada e utilizada fora da procedure, o que é útil em situações onde precisamos aplicar a variável em diferentes fluxos de processamento ou lógica, aumentando a flexibilidade do código.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Entendi a função do INOUT, mas agora outra dúvida surgiu: Pq o @ na frente da variável valor total?

solução!

Oi Érika!

Ótima pergunta. O símbolo @ que aparece na frente da variável valorTotal indica que estamos usando uma variável de sessão no MySQL. Para entender melhor, pense assim: quando você abre o MySQL Workbench, enquanto a conexão estiver ativa, a variável de sessão estará disponível. As características desse tipo de variável são:

  • As variáveis de sessão são usadas para armazenar valores temporários durante a sessão de um cliente com o servidor de banco de dados.
  • Diferente das variáveis locais (que podem ser usadas apenas numa procedure), as variáveis de sessão podem ser acessadas em qualquer lugar durante a conexão atual.
  • Quando você se desconecta do MySQL, essas variáveis são descartadas. Isso é útil para armazenar informações que você deseja usar em diferentes partes da sua sessão, sem precisar passá-las como parâmetros em cada chamada de procedure.

No exemplo que mostrei no passo a passo anterior, usamos a variável @valorTotal para salvar temporariamente o valor inicial total de 100.00. Isso foi necessário para que pudéssemos recuperar o valor atualizado após a execução da procedure com o parâmetro INOUT. Sem essa variável, não conseguiríamos acessar o novo valor após a aplicação do desconto.

Abraços e bons estudos!