Em todas as linguagens de programações existem formas de se tratar erros e imprevisto que podem ocorrer na execução de um código fonte, isso não é diferente em banco de dados, por isso a importância do assunto Tratamento de Exceções PL/SQL Oracle.
Bloco de Programação PL/SQL
Analogamente, é importante entender que o banco de dados Oracle utiliza de blocos de programações PL/SQL (Procedural Language/Structured Query Language), uma linguagem que tem sua escrita alicerçada no Pascal.
Assim sendo, um bloco de programação PL/SQL é composto por área distintas, sendo:
- uma área de declaração,
- uma área de comandos;
- e uma área de exceções.
- Tanto a área de declaração, quanto a de exceções são opcionais e podem ser omitidos.
Estrutura de um bloco PL/SQL:
DECLARE -- declarações BEGIN -- comandos EXCEPTION -- tratamento de exceções END;
Importante, um bloco de programação pode estar embutido dentro de outro bloco de programação.
Exceções (Exception)
Da mesma forma, é preciso entender que uma exceção tem relação direta com um erro de execução, não com erros de compilação.
Ou como entendido, primeiro é preciso acertar todos os erros de escrita (compilação) para depois na execução, tratar possíveis erros de execução.
As exceções podem ser predefinidas, ou definidas pelo usuário. Neste artigo trataremos as exceções predefinidas, já conhecidas e que são disparadas de modo implícito quando uma regra é violada ou um limite de sistema é excedido.
Para exemplificar abaixo temos um bloco PL/SQL que tentará executar uma divisão de um número pelo valor zero.
DECLARE TOTAL NUMBER(10,2); BEGIN TOTAL := 12 / 0; END;
De acordo com a compilação desse bloco PL/SQL nenhum erro será encontrado, assim estando pronto para a execução.
Mas, esse código ao ser executado disparará uma exceção, comum em todas as linguagens, a divisão por zero.
Assim, a execução do bloco será interrompida de forma anormal (abortada), pois há uma exceção que não foi tratada, consequentemente o bloco não será executado e explodirá para o usuário um erro.
Os tratamentos de erros em linguagens de programação são importantes, pois evitam que a execução de um código seja interrompida anormalmente e abruptamente.
Tratando Exceção
Com o tratamento aplicado, pode-se resolver o problema diretamente no código se for algo contornável, ou pode indicar ao usuário de uma forma mais amigável como lidar com essa situação.
As exceções dentro do Oracle podem ser identificadas por um nome e um número, exemplificando na execução do bloco acima tem-se:
- ZERO_DIVIDE(ORA-01476, SQLCODE -01476), ocorre na tentativa de dividir por zero.
- Clique aqui para ver uma listagem das exceções predefinidas no site oficial da Oracle.
Antes de tudo, será implantado ao bloco de programação o tratamento específico para divisão por zero, como pode ser observado abaixo:
DECLARE TOTAL NUMBER(10,2); BEGIN TOTAL := 12 / 0; EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('erro divisão por zero'); END;
O comando PUT_LINE da biblioteca DBMS_OUTPUT, funciona como um comando para imprimir na tela de resultado do script mensagens, que no caso só são vistas no ambiente Client (cliente) do banco de dados (só para o desenvolvedor).
Agora ao executar o código, quando se deparar com a exceção o bloco não será interrompido, como há a área de tratamento de exceções, o mesmo será desviado para a área EXCEPTION.
O comando WHEN tem ação parecido com a de um IF (condicional), quando o código é desviado para está área, o mesmo vem com o nome da exceção que causou o problema.
Sendo assim, se tiver um WHEN específico para essa exceção, suas linhas serão executadas.
Neste WHEN pode-se ter um ROLLBACK para desfazer qualquer insert, update ou delele que foram aplicados anteriormente.
Isso pode ser importante, pois havendo o erro é difícil saber se tudo que deveria ter sido executado foi executado.
Está ação é considerada de boa prática pelos profissionais com mais experiência em programação para banco de dados.
Tratando Exceção de forma genérica
Se bem que, tratar as exceções de forma genérica não é a melhor forma, mas pode ser a maneira de prevenir exceção desconhecidas, erros que podem acontecer que não foram previstos.
No tratamento de exceções há uma forma de capturar exceções que não foram previstas, utilizando o escopo OTHERS, que tem o significado de capturar qualquer “outra” exceção que não foi tratada anteriormente na própria seção EXCEPTION.
Para isso, pode usar duas funções para auxiliar na captura do código do erro e da descrição equivalente. As funções são:
- SQLCODE
- SQLERRM
Uma vez, detectado o código do erro, é possível entendê-lo e agora aprimorar a seção EXCEPTION e tratar o erro agora conhecido. Ficando assim, o OTHERS para identificar exceções desconhecidas.
Programadores experientes, tem a prática de utilizar em suas seções de EXCEPTION o tratamento OTHERS, que pode ser aprimorado para gravar as informações das exceções capturadas por ele em uma tabela, que pode ser checada com uma frequência em busca de erros e ter uma ação proativa na solução destes.
Bloco com tratamento OTHERS:
DECLARE TOTAL NUMBER(10,2); BEGIN TOTAL := 12 / 0; EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('erro divisão por zero'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('código erro: ' || SQLCODE); DBMS_OUTPUT.PUT_LINE('descrição erro: ' || SQLERRM); END;
Neste caso, foi implementado o tratamento OTHER, logo em seguida do tratamento ZERO_DIVIDE, assim se acontecer uma exceção ZERO_DIVIDE será tratado pelo WHEN específico. Já se acontecer qualquer outra exceção será possível conhecê-la, pesquisar sobre e posteriormente tratá-la.
Conclusão
Nos exemplos, foi implementada apenas uma linha de código para ilustrar. Pressupondo que, houvesse mais uma linha abaixo da linha da divisão por zero, esta só seria executada depois de resolvida a exceção da linha da divisão por zero. Pois, a primeira linha com erro, desvia o código diretamente para a seção EXCEPTION.
Este é o início pra quem quer implementar tratamento de exceções em seus blocos de programação PL/SQL.
Mais artigos serão produzidos avançando neste assunto relacionado ao Tratamento de Exceções PL/SQL Oracle.
Esse artigo apresenta um adendo, um vídeo complementar na plataforma youtube, que pode ser acessado, clicando no link. Ou assistido aqui no próprio artigo:
Veja mais artigos relacionados à banco de dados, clicando aqui.