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.