Estruturas de Controle de Fluxo em PL/SQL Oracle

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;
/

Tags: Oracle PL/SQL SQL Estruturas de Controle Laços de Repetição

Publicado em 6-5 07:14 por Thomas