Estruturas de controle são a base de qualquer programa, seja um script SQL, código Python ou até um robô em Marte pensando se manda sinal pra casa ou procura vida atrás da cratera.
No PL/pgSQL, as estruturas de controle ajudam a gente a:
- Executar certas ações se as condições forem verdadeiras.
- Controlar a ordem de execução do código.
- Implementar lógica de decisão.
Pode imaginar elas como placas de trânsito na estrada: "Se ver um STOP, para. Se ver o sinal verde — vai embora!"
As estruturas de controle mais populares no PL/pgSQL:
IF– checa uma condição e executa os comandos correspondentes.CASE– alternativa aoIFquando tem muita condição.RETURN– termina a execução da função e retorna o resultado.
Você já deve ter uma ideia delas. E, depois de programar em outras linguagens, entender isso aqui vai ser moleza.
Operador condicional IF
O operador IF é usado pra executar código só se uma condição for TRUE (verdadeira). Olha a estrutura básica:
IF condição THEN
-- Código que executa se a condição for verdadeira.
ELSE
-- Código alternativo se a condição for falsa.
END IF;
Vamos escrever uma função que recebe um número e retorna se ele é par ou ímpar:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN 'Número par';
ELSE
RETURN 'Número ímpar';
END IF;
END;
$$ LANGUAGE plpgsql;
Agora vamos testar ela:
SELECT check_even_odd(4); -- Número par
SELECT check_even_odd(7); -- Número ímpar
Explicando rapidinho: IF num % 2 = 0 THEN checa se o número é divisível por 2 sem resto.
Condição ELSIF
Às vezes, uma checagem só não basta e você precisa testar várias condições. Pra isso existe o ELSIF.
Imagina que temos uma função que retorna um comentário sobre a temperatura:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN 'Muito frio!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN 'Fresquinho';
ELSE
RETURN 'Quente!';
END IF;
END;
$$ LANGUAGE plpgsql;
Testando:
SELECT temperature_comment(-5); -- Muito frio!
SELECT temperature_comment(15); -- Fresquinho
SELECT temperature_comment(25); -- Quente!
Sintaxe do CASE
Se você tem um monte de condições, o operador CASE salva a pátria. Ele parece um pouco com o IF, mas é mais "elegante".
CASE
WHEN condição_1 THEN valor_1
WHEN condição_2 THEN valor_2
ELSE valor_padrão
END;
Vamos criar uma função que retorna um comentário de nota baseado no número:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN 'Excelente'
WHEN score >= 75 THEN 'Bom'
WHEN score >= 50 THEN 'Satisfatório'
ELSE 'Insatisfatório'
END;
END;
$$ LANGUAGE plpgsql;
Testando:
SELECT grade_comment(95); -- Excelente
SELECT grade_comment(80); -- Bom
SELECT grade_comment(45); -- Insatisfatório
Observação: diferente do IF, o CASE retorna um valor, então dá pra usar o operador RETURN direto dentro do CASE.
Operador RETURN
RETURN termina a execução da função e retorna um valor. Isso é super importante em funções PL/pgSQL, que precisam obrigatoriamente retornar alguma coisa (tipo texto, número, etc.).
Olha como o RETURN funciona num exemplo bem simples:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;
Resultado:
SELECT return_example(); -- Hello, World!
Mas e se a gente tiver vários caminhos no código? Tipo, checando entrada de dados. Aí o RETURN vai aparecer em vários lugares da função:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN 'Número positivo';
ELSIF num = 0 THEN
RETURN 'Zero';
ELSE
RETURN 'Número negativo';
END IF;
END;
$$ LANGUAGE plpgsql;
Testando:
SELECT check_positive_negative(10); -- Número positivo
SELECT check_positive_negative(0); -- Zero
SELECT check_positive_negative(-5); -- Número negativo
Erros comuns e onde pode dar ruim
- Esquecer o operador
END: esqueceu doEND CASE;ouEND IF;, o PostgreSQL já vai te lembrar rapidinho que precisa fechar o bloco de código. - Erros lógicos usando
ELSIF: a ordem das condições importa! Uma condição mais geral (temp > 0) não pode vir antes de uma mais específica (temp > 20). - Esqueceu do
RETURN: em PL/pgSQL a função tem que retornar alguma coisa se você declarouRETURNS.
É isso aí. A gente viu o básico das estruturas de controle e lógica no PL/pgSQL. Esse conhecimento vai te ajudar na prática pra criar funções mais complexas! Na próxima, vamos ver loops e como usar eles.
GO TO FULL VERSION