Olá! Bem-vindo ao nosso artigo sobre Exceções Predefinidas em Oracle PL/SQL. Hoje, vamos mergulhar nesse assunto e aprender como lidar com erros de forma elegante em nossos programas. Vamos lá?
O que são Exceções?
Imagine que você está dirigindo um carro. Normalmente, você segue em frente sem problemas, certo? Mas e se um pneu furar? Ou se acabar a gasolina? Essas situações inesperadas são como “exceções” na sua viagem.
No mundo da programação PL/SQL, as exceções funcionam de maneira similar. Elas são eventos inesperados que interrompem o fluxo normal do seu programa. E assim como você precisa saber como lidar com problemas no seu carro, é crucial saber como lidar com exceções no seu código.
Pre-requisitos para executar os exemplos
Criar os objetos abaixo e inserir valores nas tabelas:
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 34 35 36 37 38 |
-- Criação das tabelas CREATE TABLE aluno ( id_aluno NUMBER PRIMARY KEY, primeiro_nome VARCHAR2(30), sobrenome VARCHAR2(30), cep VARCHAR2(9) ); CREATE TABLE professor ( id_professor NUMBER PRIMARY KEY, primeiro_nome VARCHAR2(30), sobrenome VARCHAR2(30) ); CREATE TABLE matricula ( id_matricula NUMBER PRIMARY KEY, id_aluno NUMBER, id_curso NUMBER, FOREIGN KEY (id_aluno) REFERENCES aluno(id_aluno) ); -- Inserção de dados de exemplo -- Alunos INSERT INTO aluno (id_aluno, primeiro_nome, sobrenome, cep) VALUES (101, 'João', 'Silva', '12345-678'); INSERT INTO aluno (id_aluno, primeiro_nome, sobrenome, cep) VALUES (102, 'Maria', 'Santos', '12345-678'); INSERT INTO aluno (id_aluno, primeiro_nome, sobrenome, cep) VALUES (103, 'Pedro', 'Ferreira', '87654-321'); -- Professores INSERT INTO professor (id_professor, primeiro_nome, sobrenome) VALUES (1, 'Carlos', 'Oliveira'); INSERT INTO professor (id_professor, primeiro_nome, sobrenome) VALUES (2, 'Ana', 'Rodrigues'); -- Matrículas INSERT INTO matricula (id_matricula, id_aluno, id_curso) VALUES (1, 101, 1); INSERT INTO matricula (id_matricula, id_aluno, id_curso) VALUES (2, 102, 1); INSERT INTO matricula (id_matricula, id_aluno, id_curso) VALUES (3, 102, 2); -- Commit para salvar as alterações COMMIT; |
Estrutura de um Bloco PL/SQL com Tratamento de Exceções
Vamos dar uma olhada na estrutura básica de um bloco PL/SQL que inclui tratamento de exceções:
1 2 3 4 5 6 7 8 9 |
DECLARE -- Declarações de variáveis BEGIN -- Comandos executáveis EXCEPTION WHEN NOME_DA_EXCECAO THEN -- Comandos para tratar o erro END; |
É como se o seu código tivesse três partes:
- O planejamento da viagem (DECLARE)
- A viagem em si (BEGIN)
- O plano B para problemas (EXCEPTION)
Exceções Predefinidas Comuns
Oracle nos fornece várias exceções predefinidas. Vamos conhecer algumas das mais comuns:
1. NO_DATA_FOUND
Esta exceção é levantada quando um comando SELECT INTO não retorna nenhuma linha.
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DECLARE v_nome_aluno VARCHAR2(50); BEGIN SELECT primeiro_nome || ' ' || sobrenome INTO v_nome_aluno FROM aluno WHERE id_aluno = 101; DBMS_OUTPUT.PUT_LINE('Nome do aluno: ' || v_nome_aluno); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Aluno não encontrado'); END; |
2. TOO_MANY_ROWS
Esta exceção ocorre quando um SELECT INTO retorna mais de uma linha.
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DECLARE v_nome_aluno VARCHAR2(50); BEGIN SELECT primeiro_nome || ' ' || sobrenome INTO v_nome_aluno FROM aluno WHERE cep = '12345-678'; DBMS_OUTPUT.PUT_LINE('Nome do aluno: ' || v_nome_aluno); EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Mais de um aluno encontrado'); END; |
3. ZERO_DIVIDE
Esta exceção é levantada quando tentamos dividir por zero.
Exemplo:
1 2 3 4 5 6 7 8 9 10 |
DECLARE v_resultado NUMBER; BEGIN v_resultado := 10 / 0; DBMS_OUTPUT.PUT_LINE('Resultado: ' || v_resultado); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Erro: Divisão por zero'); END; |
4. VALUE_ERROR
Ocorre quando há um problema de conversão ou incompatibilidade de tamanho.
Exemplo:
1 2 3 4 5 6 7 8 9 10 |
DECLARE v_nome_curto VARCHAR2(5); BEGIN v_nome_curto := 'João da Silva'; DBMS_OUTPUT.PUT_LINE('Nome: ' || v_nome_curto); EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('Erro: Nome muito longo para a variável'); END; |
Tratando Múltiplas Exceções
Às vezes, precisamos estar preparados para lidar com diferentes tipos de problemas. É como ter um kit de emergência completo no seu carro. Veja como podemos tratar múltiplas exceções:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DECLARE v_id_aluno NUMBER := &sv_id_aluno; v_matriculado VARCHAR2(3) := 'NÃO'; BEGIN DBMS_OUTPUT.PUT_LINE('Verificando matrícula do aluno...'); SELECT 'SIM' INTO v_matriculado FROM matricula WHERE id_aluno = v_id_aluno; DBMS_OUTPUT.PUT_LINE('O aluno está matriculado em um curso'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('O aluno não está matriculado em nenhum curso'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('O aluno está matriculado em vários cursos'); END; |
Neste exemplo, estamos preparados para duas situações diferentes: quando o aluno não está matriculado (NO_DATA_FOUND) e quando está matriculado em mais de um curso (TOO_MANY_ROWS).
O Coringa: WHEN OTHERS
Às vezes, não sabemos exatamente qual problema pode ocorrer. Para esses casos, temos o WHEN OTHERS. É como ter um plano de contingência geral.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DECLARE v_id_professor NUMBER := &sv_id_professor; v_nome_professor VARCHAR2(50); BEGIN SELECT primeiro_nome || ' ' || sobrenome INTO v_nome_professor FROM professor WHERE id_professor = v_id_professor; DBMS_OUTPUT.PUT_LINE('Nome do professor: ' || v_nome_professor); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ops! Algo deu errado.'); END; |
Porém, cuidado! Usar apenas WHEN OTHERS pode mascarar erros específicos e dificultar a depuração. É como dizer “se algo der errado, apenas ignore”. Nem sempre é a melhor abordagem.
Conclusão
Entender e usar exceções predefinidas é crucial para criar programas PL/SQL robustos e confiáveis. Elas nos ajudam a lidar com situações inesperadas de forma elegante, melhorando a experiência do usuário e facilitando a manutenção do código.
Lembre-se: em programação, assim como na vida, é importante estar preparado para o inesperado. As exceções nos dão essa ferramenta.