Database
 sql >> Base de Dados >  >> RDS >> Database

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

Se você é um programador, pode estar familiarizado com o conceito de tratamento de exceção que é parte integrante de qualquer linguagem de programação. Como os erros são inevitáveis ​​e 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.

Abaixo estão os tópicos abordados neste artigo:

  • O que é uma exceção?
  • Sintaxe do tratamento de exceções
  • Tipos de Exceções
    • Definido pelo sistema
      • Exceções de sistema nomeadas
      • Exceções de sistema sem nome
    • Definido pelo usuário
      • Etapas para declarar funções definidas pelo usuário
      • Exemplos de funções definidas pelo usuário

O que é uma exceção?

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

Sintaxe de tratamento de exceção em PL/SQL

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........

WHEN others THEN
exception3-handling-statements
END;

Aqui, podemos listar quantas exceções quisermos tratar. A exceção padrão será tratada usando 'WHEN other THEN'

Exemplo de tratamento de exceção em PL/SQL


O programa abaixo exibe o nome e o endereço de um aluno cujo ID é fornecido. Como não há nenhum aluno com valor de ID 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  name, loation INTO  s_name, s_loc 
   FROM students 
   WHERE id = s_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
   DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such student!'); 
   WHEN others THEN 
      dbms_output.put_line('Oops, Error!'); 
END; 

Saída

No such student!
PL/SQL procedure successfully completed.  

Aqui, podemos listar quantas exceções quisermos tratar. A exceção padrão será tratada usando 'WHEN other THEN '

Tipos de exceções em PL/SQL

  • Definido pelo sistema
  • Usuário desafiado

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 uma exceção ocorre dentro do programa, o servidor Oracle corresponde e identifica a exceção apropriada do conjunto de exceções disponíveis no pacote padrão oracle. Basicamente, essas exceções são predefinidas em PL/SQL que são levantadas QUANDO uma regra particular do banco de dados é violada .

As exceções definidas pelo sistema são ainda divididos em duas categorias:

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

Exceções de sistema nomeado

As exceções PL/SQL nomeadas são nomeadas no pacote padrão de 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 importantes exceções pré-definidas -

Exceção Erro do Oracle SQLCODE Descrição
ACCESS_INTO_NULL 06530 -6530 Ele é gerado quando um objeto nulo recebe um valor automaticamente.
CASE_NOT_FOUND 06592 -6592 Ele é gerado quando nenhuma das opções na cláusula WHEN de uma instrução CASE é selecionada e não há cláusula ELSE.
COLLECTION_IS_NULL 06531 -6531 Ele é gerado quando um programa tenta aplicar métodos de coleção diferentes de EXISTS a uma tabela aninhada não inicializada ou varray, ou o programa tenta atribuir valores aos elementos de uma tabela aninhada não inicializada ou varray.
DUP_VAL_ON_INDEX 00001 -1 Ele é gerado quando se tenta armazenar valores duplicados em uma coluna com um índice exclusivo.
INVALID_CURSOR 01001 -1001 Ele é gerado quando são feitas tentativas de fazer uma operação de cursor que não é permitida, como fechar um cursor não aberto.
INVALID_NUMBER 01722 -1722 Ele é 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_DENIED 01017 -1017 Ele é gerado quando um programa tenta fazer logon no banco de dados com um nome de usuário ou senha inválidos.
NO_DATA_FOUND 01403 +100 Ele é gerado quando uma instrução SELECT INTO não retorna nenhuma linha.
NOT_LOGGED_ON 01012 -1012 Ele é gerado quando uma chamada de banco de dados é emitida sem estar conectada ao banco de dados.
PROGRAM_ERROR 06501 -6501 Ele é gerado quando o PL/SQL tem um problema interno.
ROWTYPE_MISMATCH 06504 -6504 Ele é gerado quando um cursor busca um valor em uma variável com tipo de dados incompatível.
SELF_IS_NULL 30625 -30625 Ele é gerado quando um método de membro é invocado, mas a instância do tipo de objeto não foi inicializada.
STORAGE_ERROR 06500 -6500 Ele é gerado quando o PL/SQL fica sem memória ou a memória está corrompida.
TOO_MANY_ROWS 01422 -1422 Ele é gerado quando uma instrução SELECT INTO retorna mais de uma linha.
VALUE_ERROR 06502 -6502 Ele é gerado quando ocorre um erro aritmético, de conversão, de truncamento ou de restrição de tamanho.
ZERO_DIVIDE 01476 1476 Ele é gerado quando é feita uma tentativa de dividir um número por zero.

Exemplo

CREATE OR REPLACE PROCEDURE add_new_student
      (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
IS
BEGIN
       INSERT INTO student (student _id, student _name )
       VALUES ( student _id_in, student _name_in );
EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN
 raise_application_error (-20001,'Duplicate student _id');
       WHEN OTHERS THEN
raise_application_error (-20002,'An error occurred.');
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 de sistema para as quais o Oracle não tem um nome são conhecidas como exceções de 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 sem nome:

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:

  • Crie-os implicitamente.
  • Caso eles não sejam tratados em 'QUANDO Outros', eles devem ser tratados explicitamente.
  • Para tratar a exceção explicitamente, eles podem ser declarados usando o Pragma EXCEPTION_INIT e tratados com referência ao nome da exceção definido pelo usuário na seção de exceção.

Um exemplo de tratamento de exceções sem nome 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.

Definido pelo usuário

Como todas as outras linguagens de programação, a Oracle também permite que você declare e implemente 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:
  • Usando variável do tipo EXCEPTION

Aqui, podemos declarar uma exceção definida pelo usuário declarando uma variável do tipo de dados EXCEPTION em nosso código e acionando-a 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 tido uma ideia aproximada das maneiras pelas quais podemos gerar exceções definidas pelo usuário em 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ção definido 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 essas três partes são:

  • Declarar um tipo de dados de exceção de variável
  • Criar a exceção
  • Tratar a exceção

Vamos escrever um código para demonstrar as etapas acima em detalhes.
DECLARE
       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. A quarta é nossa exceção definida pelo usuário.

DECLARE
       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 no nosso caso, o erro será gerado e o controle do programa pulará todas as próximas etapas e procurará o manipulador de exceção correspondente. No caso de encontrar qualquer outro, ele executará a ação de acordo, caso contrário, encerrará o programa ou nos avisará com um erro definido pelo sistema não tratado.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Este é o manipulador de exceção. Assim que o usuário inserir o divisor como 0, a string da mensagem acima será solicitada.

Código final:
DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
END;

Continuando 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

Na função PRAGMA EXCEPTION_INIT, um nome de exceção é associado a um número de erro do Oracle. Esse nome pode ser usado na criação do manipulador de exceção 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; -- Some operation that causes an ORA-00060 error
EXCEPTION
   WHEN deadlock_detected THEN
      NULL; -- handle the error
END;

O PRAGMA EXCEPTION_INIT diz ao compilador para associar um nome de exceção a um número de erro do Oracle, conforme mencionado anteriormente. Ele permite que você faça referência a qualquer exceção interna pelo 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.

Continuando 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 | FALSE}]);

Exemplo

/* A trigger trg_emp_detail_chk is created.*/
CREATE OR REPLACE TRIGGER trg_emp_detail_chk

/* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
Before UPDATE ON employees

DECLARE
permission_denied EXCEPTION;
BEGIN

/*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');

/* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
with a default text stating that the user is not authorized to do any modification in the weekends. */
END IF;
END;

Com isso encerramos este artigo sobre “Tratamento de exceções em PL/SQL”. Espero que este tópico tenha sido bem entendido e te ajudado. Tente escrever seus próprios códigos e incorpore os métodos explicados neste artigo.

Se você deseja receber treinamento de profissionais nesta tecnologia, pode optar pelo treinamento estruturado da edureka! Confira este treinamento de certificação MySQL DBA da Edureka, uma empresa confiável de aprendizado on-line com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. Este curso treina você nos principais conceitos e ferramentas e técnicas avançadas para gerenciar dados e administrar o banco de dados MySQL. Inclui aprendizado prático 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ê poderá criar e administrar seu próprio banco de dados MySQL e gerenciar dados.

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