Manipulação de exceções Oracle PL / SQL: exemplos para aumentar a exceção definida pelo usuário

Índice:

Anonim

O que é Tratamento de Exceções em PL / SQL?

Uma exceção ocorre quando o mecanismo PL / SQL encontra uma instrução que não pode executar devido a um erro que ocorre em tempo de execução. Esses erros não serão capturados no momento da compilação e, portanto, precisam ser tratados apenas no tempo de execução.

Por exemplo, se o mecanismo PL / SQL receber uma instrução para dividir qualquer número por '0', o mecanismo PL / SQL o lançará como uma exceção. A exceção só é levantada em tempo de execução pelo mecanismo PL / SQL.

As exceções impedirão a execução do programa, portanto, para evitar tal condição, elas precisam ser capturadas e tratadas separadamente. Este processo é denominado Exception-Handling, no qual o programador trata a exceção que pode ocorrer em tempo de execução.

Neste tutorial, você aprenderá os seguintes tópicos-

  • Sintaxe de tratamento de exceções
  • Tipos de exceção
  • Exceções Predefinidas
  • Exceção definida pelo usuário
  • Exceção de aumento de PL / SQL
  • Pontos importantes a serem observados na Exceção

Sintaxe de tratamento de exceções

As exceções são tratadas no bloco, nível, ou seja, uma vez que se ocorrer alguma exceção em algum bloco, o controle sairá da parte de execução desse bloco. A exceção será então tratada na parte de tratamento de exceções desse bloco. Depois de tratar a exceção, não é possível reenviar o controle de volta para a seção de execução daquele bloco.

A sintaxe a seguir explica como capturar e tratar a exceção.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Explicação da sintaxe:

  • Na sintaxe acima, o bloco de tratamento de exceções contém uma série de condições WHEN para tratar a exceção.
  • Cada condição WHEN é seguida pelo nome da exceção que se espera que seja levantada no tempo de execução.
  • Quando qualquer exceção for levantada no tempo de execução, o mecanismo PL / SQL procurará essa exceção específica na parte de tratamento de exceções. Ele começará a partir da primeira cláusula 'WHEN' e, sequencialmente, fará a pesquisa.
  • Se ele encontrou o tratamento de exceção para a exceção que foi levantada, ele executará aquela parte do código de tratamento específico.
  • Se nenhuma das cláusulas 'WHEN' estiver presente para a exceção que foi levantada, o mecanismo PL / SQL executará a parte 'WHEN OTHERS' (se houver). Isso é comum para todas as exceções.
  • Depois de executar a exceção, o controle da parte sairá do bloco atual.
  • Apenas uma parte da exceção pode ser executada para um bloco em tempo de execução. Depois de executá-lo, o controlador pulará a parte restante do tratamento de exceções e sairá do bloco atual.

Nota: WHEN OTHERS deve estar sempre na última posição da sequência. A parte de tratamento de exceção presente após WHEN OTHERS nunca será executada, pois o controle sairá do bloco após executar WHEN OTHERS.

Tipos de exceção

Existem dois tipos de exceções em Pl / SQL.

  1. Exceções Predefinidas
  2. Exceção definida pelo usuário

Exceções Predefinidas

A Oracle predefiniu algumas exceções comuns. Essas exceções têm um nome de exceção e um número de erro exclusivos. Essas exceções já estão definidas no pacote 'STANDARD' no Oracle. No código, podemos usar diretamente esses nomes de exceção predefinidos para tratá-los.

Abaixo estão algumas exceções predefinidas

Exceção Erro de código Razão de Exceção
ACCESS_INTO_NULL ORA-06530 Atribuir um valor aos atributos de objetos não inicializados
CASE_NOT_FOUND ORA-06592 Nenhuma das cláusulas 'WHEN' na instrução CASE foi satisfeita e nenhuma cláusula 'ELSE' foi especificada
COLLECTION_IS_NULL ORA-06531 Usando métodos de coleção (exceto EXISTS) ou acessando atributos de coleção em coleções não inicializadas
CURSOR_ALREADY_OPEN ORA-06511 Tentando abrir um cursor que já está aberto
DUP_VAL_ON_INDEX ORA-00001 Armazenar um valor duplicado em uma coluna do banco de dados que é restrito por um índice exclusivo
INVALID_CURSOR ORA-01001 Operações ilegais de cursor, como fechar um cursor não aberto
NÚMERO INVÁLIDO ORA-01722 A conversão do caractere em um número falhou devido a um caractere numérico inválido
NENHUM DADO ENCONTRADO ORA-01403 Quando a instrução 'SELECT' que contém a cláusula INTO não busca nenhuma linha.
ROW_MISMATCH ORA-06504 Quando o tipo de dado da variável do cursor é incompatível com o tipo de retorno do cursor atual
SUBSCRIPT_BEYOND_COUNT ORA-06533 Referência à coleção por um número de índice maior que o tamanho da coleção
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Referência à coleção por um número de índice que está fora da faixa legal (por exemplo: -1)
TOO_MANY_ROWS ORA-01422 Quando uma instrução 'SELECT' com a cláusula INTO retorna mais de uma linha
VALUE_ERROR ORA-06502 Erro aritmético ou de restrição de tamanho (por exemplo: atribuir um valor a uma variável maior do que o tamanho da variável)
DIVISÃO POR ZERO ORA-01476 Dividindo um número por '0'

Exceção definida pelo usuário

No Oracle, além das exceções predefinidas acima, o programador pode criar sua própria exceção e tratá-las. Eles podem ser criados em um nível de subprograma na parte de declaração. Essas exceções são visíveis apenas naquele subprograma. A exceção que é definida na especificação do pacote é uma exceção pública e é visível onde quer que o pacote esteja acessível. <

Sintaxe: No nível do subprograma

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Na sintaxe acima, a variável 'exception_name' é definida como tipo 'EXCEPTION'.
  • Isso pode ser usado de maneira semelhante a uma exceção predefinida.

Sintaxe: No nível de especificação do pacote

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Na sintaxe acima, a variável 'exception_name' é definida como o tipo 'EXCEPTION' na especificação do pacote de .
  • Isso pode ser usado no banco de dados onde quer que o pacote 'nome_do_pacote' possa ser chamado.

Exceção de aumento de PL / SQL

Todas as exceções predefinidas são levantadas implicitamente sempre que ocorre o erro. Mas as exceções definidas pelo usuário precisam ser levantadas explicitamente. Isso pode ser feito usando a palavra-chave 'RAISE'. Isso pode ser usado de qualquer uma das maneiras mencionadas abaixo.

Se 'RAISE' for usado separadamente no programa, ele propagará a exceção já levantada para o bloco pai. Apenas no bloco de exceção pode ser usado como mostrado abaixo.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Explicação da sintaxe:

  • Na sintaxe acima, a palavra-chave RAISE é usada no bloco de tratamento de exceções.
  • Sempre que o programa encontra a exceção "exception_name", a exceção é tratada e será concluída normalmente
  • Mas a palavra-chave 'RAISE' na parte de tratamento de exceções propagará essa exceção em particular para o programa pai.

Nota: Ao lançar a exceção para o bloco pai, a exceção que está sendo gerada também deve estar visível no bloco pai, caso contrário, o oracle lançará um erro.

  • Podemos usar a palavra-chave 'RAISE' seguida pelo nome da exceção para levantar essa exceção definida pelo usuário / predefinida em particular. Isso pode ser usado na parte de execução e na parte de tratamento de exceção para levantar a exceção.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Explicação da sintaxe:

  • Na sintaxe acima, a palavra-chave RAISE é usada na parte de execução seguida pela exceção "exception_name".
  • Isso gerará essa exceção específica no momento da execução e precisará ser tratada ou gerada posteriormente.

Exemplo 1 : Neste exemplo, vamos ver

  • Como declarar a exceção
  • Como levantar a exceção declarada e
  • Como propagá-lo para o bloco principal
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Explicação do código:

  • Linha de código 2 : Declarando a variável 'sample_exception' como tipo EXCEPTION.
  • Linha de código 3 : Declarando o procedimento nested_block.
  • Linha de código 6 : Imprimindo a instrução "Dentro do bloco aninhado".
  • Linha de código 7: Imprimindo a instrução "Raising sample_exception do bloco aninhado."
  • Linha de código 8: Gerando a exceção usando 'RAISE sample_exception'.
  • Linha de código 10: manipulador de exceção para a exceção sample_exception no bloco aninhado.
  • Linha de código 11: Imprimindo a instrução 'Exceção capturada no bloco aninhado. Subindo para o bloco principal '.
  • Linha de código 12: Gerando a exceção para o bloco principal (propagando-se para o bloco principal).
  • Linha de código 15: Imprimindo a declaração "Inside the main block".
  • Linha de código 16: Imprimindo a instrução "Calling nested block".
  • Linha de código 17: chamando o procedimento nested_block.
  • Linha de código 19: manipulador de exceções para sample_exception no bloco principal.
  • Linha de código 20: Imprimindo a declaração "Exceção capturada no bloco principal."

Pontos importantes a serem observados na Exceção

  • Em função, uma exceção deve sempre retornar um valor ou aumentar a exceção ainda mais. caso contrário, o Oracle lançará o erro 'Função retornada sem um valor' em tempo de execução.
  • As instruções de controle de transação podem ser fornecidas no bloco de tratamento de exceção.
  • SQLERRM e SQLCODE são as funções integradas que fornecerão a mensagem e o código de exceção.
  • Se uma exceção não for tratada, por padrão, todas as transações ativas naquela sessão serão revertidas.
  • RAISE_APPLICATION_ERROR (- , ) pode ser usado em vez de RAISE para levantar o erro com o código do usuário e a mensagem. O código de erro deve ser maior que 20000 e prefixado com '-'.

Resumo

Após este capítulo. você deve ser capaz de trabalhar para os seguintes aspectos das exceções Pl SQL

  • Lidando com as exceções
  • Defina uma exceção
  • Levante a exceção
  • Propagação de exceção