22/04/2020

Tratamento de Exceções PL/SQL Oracle

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.

Este artigo, tem como complemento ao vídeo postado no youtube relacionado ao canal deste Blog, que pode ser acessado, clicando na capa do vídeo, abaixo.

Capa_video_inserir_tabela

Clique para assistir ao vídeo no Youtube.

 

Mais artigos serão produzidos avançando neste assunto relacionado ao Tratamento de Exceções PL/SQL Oracle.

Veja mais artigos relacionados à banco de dados, clicando aqui.

Share

Luis Alexandre da Silva

Professor e Consultor de tecnologia em desenvolvimento de sistemas. Possui mestrado em Ciência da Computação pela UNESP (2016), especialização em Gestão Integrada de Pessoas e Sistemas de Informação pela FIB (2008) e graduação em Análise de Sistemas pela Universidade do Sagrado Coração (1997). Por fim, tem experiência em Gerenciamento de Projetos, Linguagens de Programação e Banco de Dados. Atuando principalmente nos seguintes temas: ensino, gerenciamento de projetos, ITIL, Desenvolvimento WEB e processos BPO.

Você também pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *