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 THEN WHEN OTHERSTHEN END;
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.
- Exceções Predefinidas
- 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
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- 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 PACKAGEIS 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 THEN RAISE;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 THEN END;
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