Uso de Comandos IF em PL/SQL
O comando IF permite executar código com base em condições. Abaixo, um exemplo simples com variáveis alteradas:
SET SERVEROUTPUT ON;
DECLARE
valor_num NUMBER := 5;
mensagem VARCHAR2(30) := 'Teste PL/SQL';
BEGIN
DBMS_OUTPUT.PUT_LINE(mensagem || ': ' || valor_num);
END;
/
-- Saída: Teste PL/SQL: 5
Para verificar dados de uma tabela, considere a contagem de funcionários com salário acima de um limite:
DECLARE
total_func NUMBER;
BEGIN
SELECT COUNT(*) INTO total_func FROM emp WHERE sal >= 4500;
IF total_func > 0 THEN
DBMS_OUTPUT.PUT_LINE('Existem ' || total_func || ' empregados com salário >= 4500.');
ELSE
DBMS_OUTPUT.PUT_LINE('Nenhum empregado com salário >= 4500.');
END IF;
END;
/
Para múltiplas condições, utilize ELSIF:
DECLARE
contagem NUMBER;
BEGIN
SELECT COUNT(*) INTO contagem FROM emp WHERE sal >= 4500;
IF contagem = 1 THEN
DBMS_OUTPUT.PUT_LINE('Existe um único empregado com salário >= 4500.');
ELSIF contagem > 1 THEN
DBMS_OUTPUT.PUT_LINE('Há mais de um empregado com salário >= 4500.');
ELSE
DBMS_OUTPUT.PUT_LINE('Nenhum empregado com salário >= 4500.');
END IF;
END;
/
Estrutura CASE WHEN para Controle de Fluxo
A cláss CASE WHEN avalia expressões de forma concisa. Exemplo adaptado com tabela emp:
DECLARE
num_emp NUMBER;
BEGIN
SELECT COUNT(*) INTO num_emp FROM emp WHERE sal >= 4500;
CASE num_emp
WHEN 0 THEN DBMS_OUTPUT.PUT_LINE('Zero empregados com salário >= 4500.');
WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Um empregado com salário >= 4500.');
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Dois empregados com salário >= 4500.');
WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Três empregados com salário >= 4500.');
ELSE DBMS_OUTPUT.PUT_LINE('Mais de três empregados com salário >= 4500.');
END CASE;
END;
/
Laços de Repetição em PL/SQL
Laços permitem executar código repetidamente. Considere a tabela salgrade para exemplos.
Laço Loop (Sem Condição Inicial)
Utilize EXIT WHEN para controlar a saída. Variáveis renomeadas para clareza:
DECLARE
grau NUMBER := 3;
salario_min NUMBER;
salario_max NUMBER;
BEGIN
LOOP
EXIT WHEN grau > 5;
SELECT losal, hisal INTO salario_min, salario_max FROM salgrade WHERE grade = grau;
DBMS_OUTPUT.PUT_LINE('Grau ' || grau || ': Mínimo ' || salario_min || ', Máximo ' || salario_max);
grau := grau + 1;
END LOOP;
END;
/
Laço While
Executa enquanto a condição for verdadeira:
DECLARE
grau NUMBER := 3;
salario_min NUMBER;
salario_max NUMBER;
BEGIN
WHILE grau < 6 LOOP
SELECT losal, hisal INTO salario_min, salario_max FROM salgrade WHERE grade = grau;
DBMS_OUTPUT.PUT_LINE('Grau ' || grau || ': Mínimo ' || salario_min || ', Máximo ' || salario_max);
grau := grau + 1;
END LOOP;
END;
/
Laço For
Ideal para intervalos conhecidos, com variável implícita:
DECLARE
salario_min NUMBER;
salario_max NUMBER;
BEGIN
FOR indice_grau IN 3..5 LOOP
SELECT losal, hisal INTO salario_min, salario_max FROM salgrade WHERE grade = indice_grau;
DBMS_OUTPUT.PUT_LINE('Grau ' || indice_grau || ': Mínimo ' || salario_min || ', Máximo ' || salario_max);
END LOOP;
END;
/