Aprenda a lidar com exceções em PL / SQL



Este artigo é um guia abrangente sobre como executar o tratamento de exceções em PL / SQL, discutindo os vários tipos de exceções oferecidos em PL / SQL.

Se você é um programador, deve estar familiarizado com o conceito de tratamento de exceções, que é parte integrante de qualquer . Como os erros são inevitáveis ​​e até mesmo o mais inteligente de nós pode cometer erros ao escrever o código, devemos estar familiarizados com como lidar com eles. Neste artigo, aprenderemos particularmente sobre o tratamento de exceções em PL / SQL.

Tratamento de exceções SQL em PL / SQL-EdurekaAbaixo estão os tópicos abordados neste artigo:





O que é uma exceção?

Qualquer condição ou evento anormal que interrompa o fluxo normal de nossas instruções de programa em tempo de execução ou, em palavras simples, uma exceção é um erro.

Sintaxe de tratamento de exceções em PL / SQL

DECLARE BEGIN EXCEPTION WHEN exceção1 THEN exceção1-tratamento-instruções WHEN exceção2 THEN exceção2-tratamento-instruções WHEN exceção3 THEN exceção3-tratamento-instruções ........ WHEN outros THEN exceção3-tratamento-instruções END

Aqui, podemos listar quantas exceções quisermos tratar. A exceção padrão será tratada usando 'QUANDO outros ENTÃO'



Exemplo de tratamento de exceções em PL / SQL

O programa abaixo exibe o nome e endereço de um aluno cuja ID é fornecida. Como não há aluno com ID de valor 8 em nosso banco de dados, o programa gera a exceção de tempo de execução NO_DATA_FOUND, que é capturada no bloco EXCEPTION.

DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT nome, loation INTO s_name, s_loc FROM students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('Local:' || s_loc) EXCEÇÃO QUANDO no_data_found ENTÃO dbms_output.put_line ('Não existe aluno!') QUANDO outros ENTÃO dbms_output.put_line ('Ops, erro!') END

Resultado

Esse aluno não existe! Procedimento PL / SQL concluído com sucesso.

Aqui, podemos listar quantas exceções quisermos tratar. A exceção padrão será tratada usando ' QUANDO outros ENTÃO '

Tipos de exceções em PL / SQL

  • Definido pelo sistema
  • Desafiado pelo usuário

A seguir neste artigo sobre tratamento de exceções em PL / SQL , vamos discutir sobre esses dois tipos em detalhes.



Definido pelo sistema

Definidas e mantidas implicitamente pelo servidor Oracle, essas exceções são definidas principalmente no Oracle Standard Package. Sempre que ocorre uma exceção dentro do programa, o servidor Oracle combina e identifica a exceção apropriada do conjunto de exceções disponível no pacote padrão oracle. Basicamente, essas exceções são predefinidas em PL / SQL que é gerado QUANDO determinada regra de banco de dados é violada .

o Exceções definidas pelo sistema são divididos em duas categorias:

  • Exceções de sistema nomeado
  • Exceções de sistema sem nome

Exceções de sistema nomeado

As exceções PL / SQL nomeadas são nomeado no pacote padrão do PL / SQL , portanto, o desenvolvedor não precisa definir as exceções PL / SQL em seu código. A PL / SQL fornece muitas exceções nomeadas predefinidas, que são executadas quando qualquer regra do banco de dados é violada por um programa. A tabela a seguir lista algumas das exceções predefinidas importantes e menos

Exceção Erro Oracle SQLCODE Descrição
ACCESS_INTO_NULL06530-6530Ele é gerado quando um objeto nulo é automaticamente atribuído a um valor.
CASE_NOT_FOUND06592-6592É gerado quando nenhuma das opções na cláusula WHEN de um Declaração CASE é selecionado e não há cláusula ELSE.
COLLECTION_IS_NULL06531-6531Ele é gerado quando um programa tenta aplicar métodos de coleta diferentes de EXISTS a uma tabela ou varray aninhada não inicializada, ou o programa tenta atribuir valores aos elementos de uma tabela ou varray aninhada não inicializada.
DUP_VAL_ON_INDEX00001-1Ele é gerado quando valores duplicados são tentados a serem armazenados em uma coluna com um índice exclusivo.
INVALID_CURSOR01001-1001Ele é gerado quando são feitas tentativas de fazer uma operação de cursor que não é permitida, como fechar um cursor não aberto.
NÚMERO INVÁLIDO01722-1722Ele é gerado quando a conversão de uma string de caracteres em um número falha porque a string não representa um número válido.
LOGIN_DENIED01017-1017Ele é gerado quando um programa tenta fazer logon no banco de dados com um nome de usuário ou senha inválidos.
NENHUM DADO ENCONTRADO01403+100É gerado quando uma instrução SELECT INTO não retorna nenhuma linha.
NOT_LOGGED_ON01012-1012Ele é gerado quando uma chamada de banco de dados é emitida sem estar conectada ao banco de dados.
PROGRAM_ERROR06501-6501Ele é gerado quando o PL / SQL tem um problema interno.
ROWTYPE_MISMATCH06504-6504Ele é gerado quando um cursor busca o valor em uma variável com tipo de dados incompatível.
SELF_IS_NULL30625-30625Ele é gerado quando um método de membro é chamado, mas a instância do tipo de objeto não foi inicializada.
STORAGE_ERROR06500-6500Ele é gerado quando o PL / SQL fica sem memória ou a memória é corrompida.
TOO_MANY_ROWS01422-1422É gerado quando uma instrução SELECT INTO retorna mais de uma linha.
VALUE_ERROR06502-6502É gerado quando ocorre um erro de aritmética, conversão, truncamento ou restrição de tamanho.
DIVISÃO POR ZERO014761476Ele é gerado quando é feita uma tentativa de dividir um número por zero.

Exemplo

CRIAR OU SUBSTITUIR PROCEDIMENTO add_new_student (aluno _id_in EM NÚMERO, aluno _nome_in EM VARCHAR2) ESTÁ COMEÇAR INSERIR ALUNO (aluno _id, aluno _nome) VALORES (aluno _id_in, aluno _nome_in) EXCEÇÃO QUANDO DUP_VAL_ON_INDEX2000, ENTÃO 'Duplicar_aplicar_autor_ou_aplicar' ) WHEN OTHERS THEN raise_application_error (-20002, 'Ocorreu um erro.') END

Continuando neste artigo sobre tratamento de exceções em PL / SQL, vamos entender o que são exceções de sistema sem nome.

Exceções de sistema sem nome

As exceções do sistema para as quais o Oracle não tem um nome são conhecidas como exceções do sistema sem nome. Essas exceções não ocorrem com frequência e são escritas com um código e uma mensagem associada.

Existem basicamente duas maneiras de lidar com exceções de sistema não nomeadas:

1. Usando o manipulador de exceção WHEN OTHERS

2. Associar o código de exceção a um nome e usá-lo como uma exceção nomeada.

Algumas etapas seguidas para exceções de sistema sem nome são:

  • Eleve-os implicitamente.
  • No caso de eles não serem tratados em ‘QUANDO Outros’, então, eles devem ser tratados explicitamente.
  • Para tratar a exceção explicitamente, eles podem ser declarados usando Pragma EXCEPTION_INIT e tratados referenciando o nome de exceção definido pelo usuário na seção de exceção.

Um exemplo de tratamento de exceções não nomeadas usando Pragma EXCEPTION_INIT é fornecido posteriormente neste artigo. Continuando neste artigo sobre tratamento de exceções em PL / SQL, vamos entender as exceções definidas pelo usuário.

Usuário definido

Como todas as outras linguagens de programação, o Oracle também permite que você declare a implementação de anúncios suas próprias exceções. Ao contrário das exceções definidas pelo sistema, essas exceções são levantadas explicitamente no bloco PL / SQL.

Etapas para declarar exceções definidas pelo usuário no banco de dados Oracle

Podemos definir exceções definidas pelo usuário no banco de dados Oracle das 3 maneiras a seguir:

python def __init __ (self)
  • Usando Variável do tipo EXCEPTION

Aqui, podemos declarar uma exceção definida pelo usuário, declarando uma variável de EXCEPTION tipo de dados em nosso código e aumentá-lo explicitamente em nosso programa usando a instrução RAISE.

  • Usando a função PRAGMA EXCEPTION_INIT

Podemos definir um número de erro não predefinido com a variável do tipo de dados EXCEPTION

  • Usando o método RAISE_APPLICATION_ERROR

Usando esse método, podemos declarar uma exceção definida pelo usuário com nosso próprio número de erro e mensagem personalizados.

Até agora, você deve ter uma ideia aproximada sobre as maneiras como podemos gerar exceções definidas pelo usuário no PL / SQL. Aprenderemos sobre cada um dos métodos mencionados acima com exemplos mais adiante neste artigo sobre tratamento de exceções em PL / SQL.

A seguir neste artigo, vamos prosseguir com as demonstrações de tratamento de exceções definidas pelo usuário.

Demonstração de exceções definidas pelo usuário

Continuando neste artigo sobre Tratamento de exceções em PL / SQL, vamos entender como usar a variável do tipo EXCEPTION.

Usando Variável do tipo EXCEPTION

O processo de declaração de exceção definida pelo usuário é dividido em três partes e estas 3 partes são:

  • Declare um tipo de dados de exceção variável
  • Levante a exceção
  • Lidar com a exceção

Vamos escrever um código para demonstrar as etapas acima em detalhes.

DECLARAR var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

No bloco de declaração acima, temos quatro variáveis, entre as quais as três primeiras são variáveis ​​de tipo de dados de número normal e a quarta que é ex_DivZero é a variável de tipo de dados de exceção especial. O quarto é nossa exceção definida pelo usuário.

DECLARAR var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION

A parte de execução acima deste bloco anônimo entrará em ação somente quando o divisor for 0. Se o divisor for zero como é em nosso caso, o erro será gerado e o controle do programa irá pular todos os próximos passos e irá procurar pelo manipulador de exceção correspondente. No caso de encontrar qualquer outro, ele executará a ação de acordo, caso contrário, ele encerrará o programa ou nos avisará com um erro não tratado definido pelo sistema.

EXCEÇÃO QUANDO ex_DivZero ENTÃO DBMS_OUTPUT.PUT_LINE (‘ERROR, O divisor não pode ser zero’)

Este é o manipulador de exceções. Assim que o usuário inserir divisor como 0, a string de mensagem acima será exibida.

instalar php no windows 8

Código Final:

DECLARAR var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero FIM IF Var_result: = var_divisor Resultado DBMS_OUTPUT.PUT_LINE ('var_divisor IF var_divisor) || = 0 ENTÃO AUMENTE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Result =' || var_result) END

Prosseguindo neste artigo sobre tratamento de exceções em PL / SQL, vamos entender como usar o método PRAGMA_EXCEPTION_INIT.

Usando a função PRAGMA EXCEPTION_INIT

No Função PRAGMA EXCEPTION_INIT, um nome de exceção é associado a um número de erro Oracle. Esse nome pode ser usado no projeto do manipulador de exceções para o erro.Para grandes projetos com muitos erros definidos pelo usuário, PRAGMA EXCEPTION_INIT é o método mais útil e adequado.

Sintaxe:

PRAGMA EXCEPTION_INIT (exception_name, -Oracle_error_number)

Exemplo

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - Alguma operação que causa um erro ORA-00060 EXCEPTION WHEN deadlock_detected THEN NULL - trata o erro END

O PRAGMA EXCEPTION_INIT informa ao compilador para associar um nome de exceção a um número de erro Oracle, conforme mencionado anteriormente. Ele permite que você se refira a qualquer exceção interna por nome e escreva um manipulador específico para ela. Quando você vê uma pilha de erros ou uma sequência de mensagens de erro, a que está no topo é aquela que pode ser interceptada e tratada.

Prosseguindo neste artigo sobre Tratamento de exceções em PL / SQL, vamos entender como usar o método RAISE_APPLICATION_ERROR.

Usando o método RAISE_APPLICATION_ERROR

É um procedimento que vem embutido no software oracle. Usando este procedimento, podemos associar um número de erro a uma mensagem de erro personalizada. Combinando o número do erro e a mensagem de erro personalizada, uma string de erro pode ser composta que se parece com aquelas strings de erro padrão que são exibidas pelo oracle quando um erro é encontrado. O procedimento RAISE_APPLICATION_ERROR é encontrado dentro do pacote DBMS_STANDARD

Sintaxe

raise_application_error (error_number, message [, TRUE])

Exemplo

/ * Um gatilho trg_emp_detail_chk é criado. * / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / * O tempo do gatilho é declarado como BEFORE UPDATE na tabela EMPLOYEES. * / Antes de UPDATE ON funcionários DECLARE permission_denied EXCEPTION BEGIN / * Início da verificação da condição IF dia da hora do sistema é sábado ou domingo ou não. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error (-20000, 'Você não está autorizado a fazer qualquer modificação nos finais de semana !! ') / * A procedure raise_application_error é chamada com o primeiro valor do parâmetro como -20000 e o segundo parâmetro com um texto padrão informando que o usuário não está autorizado a fazer qualquer modificação nos finais de semana. * / END IF END

Com isso, encerramos este artigo sobre “Tratamento de exceções em PL / SQL”. Espero que este tópico seja bem compreendido e ajudado você. Tente escrever seus próprios códigos e incorporar os métodos explicados neste artigo.

Se você deseja ser treinado por profissionais nessa tecnologia, pode optar pelo treinamento estruturado da edureka! Veja isso pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. Este curso o treina nos principais conceitos e ferramentas e técnicas avançadas para gerenciar dados e administrar o banco de dados MySQL. Inclui aprendizagem prática em conceitos como MySQL Workbench, MySQL Server, Modelagem de Dados, MySQL Connector, Database Design, MySQL Command line, MySQL Functions etc. Ao final do treinamento, você será capaz de criar e administrar seu próprio banco de dados MySQL e gerenciar dados.

Tem alguma questão para nós? Mencione isso na seção de comentários deste artigo “Tratamento de exceções em PL / SQL” e entraremos em contato com você o mais breve possível.