Olá, futuro mestre em PL/SQL! Nesse artigo vamos explorar as instruções CASE. Prepare-se para aprender uma ferramenta poderosa que vai deixar seu código mais limpo e eficiente.
O que são Instruções CASE?
Imagine que você está em uma lanchonete. O atendente pergunta: “O que você vai querer?”. Dependendo da sua resposta, ele vai preparar um lanche diferente. Essa é exatamente a ideia por trás das instruções CASE em PL/SQL!
As instruções CASE são como um cardápio inteligente no seu código. Elas permitem que você tome decisões baseadas em diferentes condições, de forma organizada e fácil de entender.
Tipos de Instruções CASE
Existem dois tipos principais de instruções CASE:
- CASE simples
- CASE pesquisado (ou Searched CASE)
Vamos explorar cada um deles com exemplos práticos.
1. CASE Simples
O CASE simples é como um menu de opções fixas. Você tem um valor específico (chamado de seletor) e compara esse valor com várias opções.
Estrutura básica:
1 2 3 4 5 6 |
CASE seletor WHEN valor1 THEN ação1; WHEN valor2 THEN ação2; ... ELSE ação_padrão; END CASE; |
Vamos ver um exemplo prático usando a tabela JOBS do schema HR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DECLARE v_job_id jobs.job_id%TYPE := 'IT_PROG'; v_job_title jobs.job_title%TYPE; v_priority VARCHAR2(20); BEGIN SELECT job_title INTO v_job_title FROM jobs WHERE job_id = v_job_id; CASE v_job_id WHEN 'IT_PROG' THEN v_priority := 'Alta'; WHEN 'SA_REP' THEN v_priority := 'Média'; WHEN 'ST_CLERK' THEN v_priority := 'Normal'; ELSE v_priority := 'Baixa'; END CASE; DBMS_OUTPUT.PUT_LINE('O cargo ' || v_job_title || ' tem prioridade de contratação: ' || v_priority); END; / |
Neste exemplo, estamos determinando a prioridade de contratação com base no ID do cargo. É como se tivéssemos uma tabela de prioridades pré-definida.
2. CASE Pesquisado
O CASE pesquisado é mais flexível. É como um processo de avaliação onde você pode criar suas próprias regras para cada opção.
Estrutura básica:
1 2 3 4 5 6 |
CASE WHEN condição1 THEN ação1; WHEN condição2 THEN ação2; ... ELSE ação_padrão; END CASE; |
Vamos ver um exemplo usando as tabelas EMPLOYEES e DEPARTMENTS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
DECLARE v_employee_id employees.employee_id%TYPE := 103; v_salary employees.salary%TYPE; v_department_name departments.department_name%TYPE; v_raise_percentage NUMBER; BEGIN SELECT e.salary, d.department_name INTO v_salary, v_department_name FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id = v_employee_id; CASE WHEN v_department_name = 'IT' AND v_salary < 5000 THEN v_raise_percentage := 10; WHEN v_department_name = 'Sales' OR v_salary > 10000 THEN v_raise_percentage := 5; WHEN v_department_name = 'Finance' AND v_salary BETWEEN 6000 AND 8000 THEN v_raise_percentage := 7; ELSE v_raise_percentage := 3; END CASE; DBMS_OUTPUT.PUT_LINE('O funcionário do departamento ' || v_department_name || ' receberá um aumento de ' || v_raise_percentage || '%'); END; / |
Neste exemplo, estamos determinando o percentual de aumento salarial com base em condições mais complexas, combinando o departamento e o salário atual do funcionário.
CASE Simples vs. CASE Pesquisado: Entendendo as Diferenças
Imagine que você está em uma lanchonete. Existem duas formas de fazer seu pedido:
- Escolher um combo do menu (CASE simples)
- Montar seu próprio lanche com ingredientes específicos (CASE pesquisado)
Vamos explorar cada um deles:
1. CASE Simples: O Menu de Combos
O CASE simples é como escolher um combo pré-definido no menu de uma lanchonete.
Estrutura:
1 2 3 4 5 6 |
CASE seletor WHEN valor1 THEN ação1; WHEN valor2 THEN ação2; ... ELSE ação_padrão; END CASE; |
Características do CASE Simples:
- Tem um “seletor” (como o número do combo no menu)
- Compara o seletor com valores específicos (como os números dos combos)
- Executa uma ação baseada na correspondência exata
Exemplo com o schema HR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DECLARE v_job_id employees.job_id%TYPE := 'IT_PROG'; v_job_category VARCHAR2(50); BEGIN CASE v_job_id WHEN 'IT_PROG' THEN v_job_category := 'Tecnologia'; WHEN 'SA_REP' THEN v_job_category := 'Vendas'; WHEN 'FI_ACCOUNT' THEN v_job_category := 'Finanças'; ELSE v_job_category := 'Outros'; END CASE; DBMS_OUTPUT.PUT_LINE('Categoria do cargo: ' || v_job_category); END; / |
Neste exemplo, v_job_id
é o seletor. É como se você dissesse: “Quero o combo número ‘IT_PROG'”.
2. CASE Pesquisado: Montando Seu Próprio Lanche
O CASE pesquisado é como montar seu próprio lanche, escolhendo ingredientes específicos baseados em várias condições.
Estrutura:
1 2 3 4 5 6 |
CASE WHEN condição1 THEN ação1; WHEN condição2 THEN ação2; ... ELSE ação_padrão; END CASE; |
Características do CASE Pesquisado:
- Não tem um seletor específico
- Usa condições complexas (como “Se tiver alface E tomate, OU se for vegetariano”)
- Executa uma ação baseada na primeira condição verdadeira
Exemplo com o schema HR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
DECLARE v_employee_id employees.employee_id%TYPE := 103; v_salary employees.salary%TYPE; v_hire_date employees.hire_date%TYPE; v_employee_status VARCHAR2(50); BEGIN SELECT salary, hire_date INTO v_salary, v_hire_date FROM employees WHERE employee_id = v_employee_id; CASE WHEN v_salary > 10000 AND v_hire_date < DATE '2005-01-01' THEN v_employee_status := 'Veterano bem remunerado'; WHEN v_salary > 8000 OR MONTHS_BETWEEN(SYSDATE, v_hire_date) > 60 THEN v_employee_status := 'Experiente'; WHEN v_salary < 5000 AND v_hire_date > DATE '2015-01-01' THEN v_employee_status := 'Novato em treinamento'; ELSE v_employee_status := 'Padrão'; END CASE; DBMS_OUTPUT.PUT_LINE('Status do funcionário: ' || v_employee_status); END; / |
Neste exemplo, não há um seletor único. É como se você dissesse: “Quero um lanche que tenha isso E aquilo, OU que seja assim…”.
Principais Diferenças
- Seletor vs. Condições
- CASE Simples: Usa um seletor único (como escolher um número do menu)
- CASE Pesquisado: Usa condições complexas (como especificar ingredientes detalhados)
- Flexibilidade
- CASE Simples: Menos flexível, bom para comparações diretas
- CASE Pesquisado: Mais flexível, permite condições complexas e variadas
- Uso de Operadores
- CASE Simples: Geralmente usa apenas igualdade (=)
- CASE Pesquisado: Pode usar qualquer operador lógico (AND, OR, >, <, etc.)
- Tipo de Dados
- CASE Simples: O seletor e os valores comparados devem ser do mesmo tipo
- CASE Pesquisado: Pode misturar diferentes tipos de dados nas condições
Quando Usar Cada Um?
- Use CASE Simples quando:
- Você está comparando um valor com várias opções específicas
- As comparações são simples e diretas
- Use CASE Pesquisado quando:
- Você precisa de condições mais complexas
- Você quer comparar diferentes colunas ou usar funções nas condições
Exercício Prático
Vamos criar um exemplo que mostra ambos os tipos de CASE em ação:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
DECLARE v_employee_id employees.employee_id%TYPE := 103; v_job_id employees.job_id%TYPE; v_salary employees.salary%TYPE; v_department_id employees.department_id%TYPE; v_job_level VARCHAR2(20); v_salary_category VARCHAR2(20); BEGIN SELECT job_id, salary, department_id INTO v_job_id, v_salary, v_department_id FROM employees WHERE employee_id = v_employee_id; -- CASE Simples para determinar o nível do cargo CASE v_job_id WHEN 'IT_PROG' THEN v_job_level := 'Tecnologia'; WHEN 'SA_REP' THEN v_job_level := 'Vendas'; WHEN 'FI_ACCOUNT' THEN v_job_level := 'Finanças'; ELSE v_job_level := 'Outro'; END CASE; -- CASE Pesquisado para categorizar o salário CASE WHEN v_salary > 15000 THEN v_salary_category := 'Alto'; WHEN v_salary BETWEEN 10000 AND 15000 AND v_department_id = 80 THEN v_salary_category := 'Médio-Alto'; WHEN v_salary < 5000 OR v_department_id IN (30, 40, 50) THEN v_salary_category := 'Entrada'; ELSE v_salary_category := 'Médio'; END CASE; DBMS_OUTPUT.PUT_LINE('Nível do cargo: ' || v_job_level); DBMS_OUTPUT.PUT_LINE('Categoria salarial: ' || v_salary_category); END; / |
Neste exercício, usamos:
- CASE Simples para categorizar o cargo baseado no
job_id
- CASE Pesquisado para categorizar o salário baseado em condições mais complexas
Experimente mudar o v_employee_id
para ver como os resultados mudam para diferentes funcionários!
Mais um Exemplo Prático
Vamos consolidar o que aprendemos com um exercício usando as tabelas do schema HR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
DECLARE v_employee_id employees.employee_id%TYPE := 105; -- Experimente mudar este valor v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; v_job_id employees.job_id%TYPE; v_salary employees.salary%TYPE; v_commission_pct employees.commission_pct%TYPE; v_bonus NUMBER; BEGIN SELECT first_name, last_name, job_id, salary, commission_pct INTO v_first_name, v_last_name, v_job_id, v_salary, v_commission_pct FROM employees WHERE employee_id = v_employee_id; -- Use um CASE pesquisado para determinar o bônus CASE WHEN v_job_id = 'SA_MAN' AND v_salary > 10000 THEN v_bonus := v_salary * 0.2; WHEN v_job_id LIKE 'SA_%' AND v_commission_pct IS NOT NULL THEN v_bonus := v_salary * v_commission_pct; WHEN v_job_id = 'IT_PROG' AND v_salary < 6000 THEN v_bonus := 1000; WHEN v_salary > 8000 THEN v_bonus := v_salary * 0.1; ELSE v_bonus := 500; END CASE; DBMS_OUTPUT.PUT_LINE('O funcionário ' || v_first_name || ' ' || v_last_name || ' receberá um bônus de R$ ' || v_bonus); END; / |
Este exercício simula um sistema de cálculo de bônus para os funcionários. Tente mudar o valor de v_employee_id
e veja como o bônus muda para diferentes funcionários!
Informações Importantes
- Ordem importa: Nas instruções CASE, a ordem das condições é crucial. O PL/SQL para na primeira condição verdadeira que encontrar.
- Sempre use ELSE: É uma boa prática sempre incluir uma cláusula ELSE para lidar com casos inesperados.
- Evite aninhamento excessivo: Se você se pegar aninhando muitos CASE, considere refatorar seu código.
- Teste todas as possibilidades: Certifique-se de testar todos os caminhos possíveis do seu CASE para evitar surpresas.
Conclusão
Entender a diferença entre CASE Simples e CASE Pesquisado é crucial para escrever código PL/SQL eficiente e legível. O CASE Simples é ótimo para comparações diretas, enquanto o CASE Pesquisado oferece mais flexibilidade para condições complexas.
Lembre-se:
- CASE Simples é como escolher um combo no menu
- CASE Pesquisado é como montar seu próprio lanche com ingredientes específicos
Pratique usando ambos os tipos em diferentes cenários para se tornar proficiente em escolher o melhor para cada situação. Com o tempo, você desenvolverá um instinto para quando usar cada um, tornando seu código PL/SQL mais elegante e eficaz.