12/05/2020

Exceções Definidas pelo Usuário PL/SQL Oracle

Há a possibilidade no tratamento de exceções (exception) da criação de Exceções Definidas pelo Usuário em PL/SQL Oracle.

Contudo, as exceções definidas pelo usuário se diferenciam das pré-definidas, porque estas são declaradas e chamadas explicitamente pelo uso do comando RAISE.

Assim, com a aplicação do comando RAISE é possível em qualquer ponto do código de um bloco PL/SQL desviar sua execução para a área de exceções. Sendo possível sua identificação de acordo como o nome da exceção definida pelo usuário.

Bloco de Programação PL/SQL: Estrutura

Entretanto, é importante relembrar a estrutura de um bloco de programação PL/SQL, que é composto por área distintas, sendo a área:

  • de declaração,
  •  sobre comandos;
  • de exceções.
  • de declaração e de exceções são opcionais e podem ser omitidos. 

Estrutura de um bloco PL/SQL:

DECLARE
   -- declarações
BEGIN
   -- comandos
EXCEPTION
   -- tratamento de exceções
END;

Desse modo, é importante, um bloco de programação pode estar embutido dentro de outro bloco de programação.    

Exceções Definidas pelo Usuário (Exception)

Da mesma forma, é preciso entender que uma exceção tem relação direta com um erro de execução, não com erros de compilação.

Bem como entendido, primeiro é preciso acertar todos os erros de escrita (compilação) para depois na execução, tratar possíveis erros de execução.

De fato, as exceções podem ser predefinidas, ou definidas pelo usuário. Neste artigo trataremos as exceções definidas pelo usuário.

Como resultado, são disparadas de modo explícito quando um comando RAISE é disparado no código PL/SQL, acessando explicitamente uma EXCEPTION declarada pelo usuário.

Função (Function) utilizada no experimento prático

Exemplificando, abaixo temos um bloco PL/SQL que que utiliza de estruturas condicionais (IFs) para validar os parâmetros. Esta é uma forma de fazer esse tipo de tratamento.

CREATE OR REPLACE 
FUNCTION FUNC_CADPESSOA(PID IN NUMBER, PNOME IN VARCHAR2)
RETURN NUMBER
IS
    RET NUMBER := 0;
    QTDE NUMBER(1);
BEGIN
    IF PID > 0 AND PID <= 999 THEN
        IF LENGTH(PNOME) <= 120 AND PNOME IS NOT NULL THEN
            SELECT COUNT(*) INTO QTDE FROM PESSOA
                    WHERE ID = PID;
            IF QTDE = 0 THEN
                INSERT INTO PESSOA (ID, NOME)
                    VALUES (PID, PNOME);
            ELSE
                RET := -997;
            END IF;
        ELSE
            RET := -998;
        END IF;
    ELSE
        RET := -999;
    END IF;
    COMMIT;
    RETURN RET;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('código erro: ' || SQLCODE);
      DBMS_OUTPUT.PUT_LINE('descrição erro: ' || SQLERRM);
      ROLLBACK;
      RETURN SQLCODE;
END;

É possível fazer o mesmo tipo de tratamento utilizando exceções declaradas pelo usuário para realizar esta checagem, desviando o código para a seção EXCEPTION.

Função (Function) adaptada usando exceção criada pelo usuário experimento prático

O código abaixo tem uma modificação na validação do campo ID, onde ao invés de usar um condicional (IF) para verificar sua faixa de valor válido, é usada uma exceção criada pelo usuário:

CREATE OR REPLACE 
FUNCTION FUNC_CADPESSOA(PID IN NUMBER, PNOME IN VARCHAR2)
RETURN NUMBER
IS
    RET NUMBER := 0;
    QTDE NUMBER(1);
    VALIDA_ID_FAIXA EXCEPTION;
BEGIN
    IF PID > 0 AND PID <= 999 THEN
        IF LENGTH(PNOME) <= 120 AND PNOME IS NOT NULL THEN
            SELECT COUNT(*) INTO QTDE FROM PESSOA
                    WHERE ID = PID;
            IF QTDE = 0 THEN
                INSERT INTO PESSOA (ID, NOME)
                    VALUES (PID, PNOME);
            ELSE
                RET := -997;
            END IF;
        ELSE
            RET := -998;
        END IF;
    ELSE
        RAISE VALIDA_ID_FAIXA;
    END IF;
    COMMIT;
    RETURN RET;
EXCEPTION   
   WHEN VALIDA_ID_FAIXA THEN
     ROLLBACK;    
     RETURN -999;
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('código erro: ' || SQLCODE);
      DBMS_OUTPUT.PUT_LINE('descrição erro: ' || SQLERRM);
      ROLLBACK;
      RETURN SQLCODE;
END;

As linhas 7, 23, 28, 29 e 30 identificam as mudanças realizadas no código, que agora utiliza de uma exceção criada pelo usuário para fazer o tratamento referente a faixa de valor válida do parâmetro ID.

Assim que, para realizar os testes do experimento prático no código, primeiramente deve-se criar a tabela PESSOA:

CREATE TABLE PESSOA(
    ID NUMBER(3) PRIMARY KEY,
    NOME VARCHAR2(120) NOT NULL
);

A execução e verificação do retorno da exceção VALIDA_ID_FAIXA, é necessário executar o bloco a seguir, após a criação da tabela e a compilação sem erros da função modificada:

DECLARE
    X NUMBER(4);
BEGIN
    X := FUNC_CADPESSOA(9999, 'MARIA');
    DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUCAO: ' || X);
END;

Conclusão

Em conclusão, utilização de Exceções Definidas pelo Usuário PL/SQL Oracle podem facilitar ao desenvolvedor a concentração dos tratamentos das exceções, juntamente com as verificações de validações dos parâmetros, ou outras validações dentro do código em um único ambiente.

Neste caso, dentro da seção específica para tratar exceções (EXCEPTION) de um bloco de programação PL/SQL.

Para uma melhor compreensão do recurso apresentado neste artigo é indicado a leitura do artigo Tratamento de Exceções PL/SQL Oracle, que dá uma visão sobre exceções predefinidas.

Veja mais artigos relacionados à Banco de Dados, clique aqui.

Share

Luis Alexandre da Silva

Professor e Consultor de tecnologia em desenvolvimento de sistemas. Possui mestrado em Ciência da Computação pela UNESP (2016), especialização em Gestão Integrada de Pessoas e Sistemas de Informação pela FIB (2008) e graduação em Análise de Sistemas pela Universidade do Sagrado Coração (1997). Por fim, tem experiência em Gerenciamento de Projetos, Linguagens de Programação e Banco de Dados. Atuando principalmente nos seguintes temas: ensino, gerenciamento de projetos, ITIL, Desenvolvimento WEB e processos BPO.

Você também pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *