Exceptions

Vamos ver um pouco mais sobre o Exception Block. Ele foi visto rapidamente em um dos posts introdutórios, apenas falando sobre os blocos existentes no PL/SQL.

Como já foi dito em um post passado, esse bloco serve para tratar erros enquanto o bloco de execução está sendo executado. Erros que ocorrem no bloco de declaração não serão pegos pelo exception block, apenas serão lançados.

O Oracle já provê duas funções para gerenciar essas funções, que são:

  • SQLCODE – Retorna um número negativo que mapeia para um exceção prefinida do Oracle, apenas uma exceção retorna um número positivo, 100, que é a exceção NO_DATA_FOUND
  • SQLERRM – Retorna o mesmo que a função anterior, mas poderá retornar um número positivo para exceções definidas, criadas, pelo próprio usuário. Além da mensagem de erro.
  • O exemplo mais simples desse bloco é quando usamos OTHERS, assim capturamos todo e qualquer erro que foi lançado no bloco de execução, como aconteceu abaixo:

    A Oracle já pré definiu várias exceções, que são as PRE-DEFINED EXCEPTIONS, para ver algumas delas poderá ver nesse link: http://docs.oracle.com/database/121/LNPLS/errors.htm#LNPLS00703

    Neste mesmo link, poderá ver que junto com o código do erro(internally defined exception), tem um nome associado a ele também(predefined exception), então poderemos mudar o OTHERS pelo nome do erro, no caso acima, como foi o erro -6502, o nome é o VALUE_ERROR. O resultado será o mesmo se efetuarmos a troca apenas no código acima, pois esse tratamento agora foi específico para este erro, se outro tipo de erro ocorrer, ele não será tratado. É sempre recomendando utilizamos os erros específicos, e por ultimo um WHEN com OTHERS.

    Existe casos em que existe no Oracle uma internally defined exceptions(o código do erro e será lançado automaticamente pelo mecanismo do Oracle), mas não possui uma predefined exceptions. Este caso se chama de Non-predefined exceptions. Podemos então criar e associar uma predefined exceptions a este código já existente.

    Para isto devemos primeiro criar uma variável exception e mapear para esse código, tudo no bloco declare. Assim, no bloco exception podemos então utilizar um WHEN com esta variável. Esse processo será demonstrado mais adiante no neste mesmo post.

    Vejamos agora como definir nossas próprias exceções.

    User-Defined Exceptions

    Existe dois modos de fazer isso, a primeira é apenas declarar a variável de exceção. Esta variável nos permite apenas pegar e tratar uma exceção definida pelo usuário em conjunto com OTHERS, já que o SQLCODE sempre será 1. Dentro desse bloco teremos um IF que irá testar se o SQLCODE será 1 e aí faremos o tratamento. Vejamos.

    Um modo melhor seria utilizar a variável no WHEN, ao invés de verificar o SQLCODE. Veja como ficaria abaixo.

    DECLARE
      v_exc EXCEPTION;
    BEGIN
      RAISE v_exc;
    EXCEPTION
      WHEN v_exc THEN
        dbms_output.put_line('User-Defined Exception!!!');
    END;
    /
    

    O código acima irá retornar a mensagem: User-Defined Exception!!!.

    O outro modo é que além de declarar a variável de exceção como vimos no exemplo anterior, é que o segundo passo após isso é mapear a variável para a PRAGMA EXCEPTION_INIT, no qual mapeia um código de erro do Oracle para uma exceção definida pelo usuário. Isto acontece na linha 4 do código abaixo.

    Percebam que agora o bloco trata apenas a exceção que criamos, e que retorna o código -6502, o mesmo do primeiro exemplo, e não 1 como antes.

    Dynamic User-Defined Exceptions

    Com uma Dynamic User-Defined Exceptions podemos customizar uma exceção com um número entro -20999 e -20000 com o uso do RAISE_APPLICATION_ERROR. Veja um exemplo.

    Algumas observações. As user Definied exceptions terão que ser lançadas de modo explícito, pois não existe nenhum mecanismo no Oracle para fazer com que a exceção criada pelo usuário seja lançada de modo automático quando algo ocorrer.

    Anúncios

    Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

    Marcado com: , , , , , ,
    Publicado em PL/SQL

    Deixe um comentário

    Preencha os seus dados abaixo ou clique em um ícone para log in:

    Logotipo do WordPress.com

    Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

    Foto do Google

    Você está comentando utilizando sua conta Google. Sair /  Alterar )

    Imagem do Twitter

    Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

    Foto do Facebook

    Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

    Conectando a %s

    Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

    Esse Blog é reconhecido pela
    Certificações
    Sou articulista

    Clique para seguir este blog e receber notificações via email de novos posts.

    Tércio Costa

    Tércio Costa

    Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

    Links Pessoais

    Serviços verificados

    Visualizar Perfil Completo →

    Total de Visualizações da Página
    • 138.077 Visualizações
    %d blogueiros gostam disto: