Propagate exceptions in nested blocks and call applications

Ainda sobre exceptions, vejamos o comportamento do Oracle ao ter um erro lançado quando existe blocos aninhados. Será que vai para toda a instrução no momento do erro? Bem, já vimos que quando um erro ocorre e ele não é tratado, ele é lançado para quem executou essa instrução. No caso, o bloco exterior, e assim por diante. Apenas o bloco que acontecer o erro será finalizado, continuando na linha após terminar o bloco interior. Um pouco difícil de entender assim lendo? Então vamos ver na prática.

BEGIN
  DBMS_OUTPUT.PUT_LINE('Inicio do bloco 1');
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Inicio do bloco 2');
    DECLARE
      v_id NUMBER;
    BEGIN
      DBMS_OUTPUT.PUT_LINE('Inicio do bloco 3');
      SELECT employee_id 
      INTO v_id 
      FROM employees;
      DBMS_OUTPUT.PUT_LINE('Final do bloco 3');
    EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('ERRO!');
    END;
    DBMS_OUTPUT.PUT_LINE('Final do bloco 2');
  END;
  DBMS_OUTPUT.PUT_LINE('Final do bloco 1');
END;;
/

A retorno é o seguinte:

Procedimento PL/SQL concluído com sucesso.

Procedimento PL/SQL concluído com sucesso.

Inicio do bloco 1
Inicio do bloco 2
Inicio do bloco 3
ERRO!
Final do bloco 2
Final do bloco 1

Perceba que o erro foi tratado no mesmo bloco onde ele ocorreu. Sendo assim, tudo que ocorreu depois do erro neste bloco não foi executado. Podemos perceber que ele não imprimiu o Final do bloco 3. Mas imprimiu dos outros dois blocos, retornando assim a execução para os blocos superiores.

Agora vejamos o exemplo do erro ser tratado em um bloco antes.

BEGIN
  DBMS_OUTPUT.PUT_LINE('Inicio do bloco 1');
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Inicio do bloco 2');
    DECLARE
      v_id NUMBER;
    BEGIN
      DBMS_OUTPUT.PUT_LINE('Inicio do bloco 3');
      SELECT employee_id 
      INTO v_id 
      FROM employees;
      DBMS_OUTPUT.PUT_LINE('Final do bloco 3');
    END;
    DBMS_OUTPUT.PUT_LINE('Final do bloco 2');
    EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('ERRO!');
  END;
  DBMS_OUTPUT.PUT_LINE('Final do bloco 1');
END;
/

O retorno foi o seguinte:

Procedimento PL/SQL concluído com sucesso.

Inicio do bloco 1
Inicio do bloco 2
Inicio do bloco 3
ERRO!
Final do bloco 1

Perceba que o erro aconteceu no bloco 3, mas como o bloco 3 não tem tratamento de erros, o erro foi lançado para o bloco 2, assim o ele recebeu o erro e parou a execução e passou para o tratamento do erro. Pois isso não é exibida nem a mensagem do final do bloco 3 nem do 2. Vejamos agora o tratamento do erro no bloco 1.

BEGIN
  DBMS_OUTPUT.PUT_LINE('Inicio do bloco 1');
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Inicio do bloco 2');
    DECLARE
      v_id NUMBER;
    BEGIN
      DBMS_OUTPUT.PUT_LINE('Inicio do bloco 3');
      SELECT employee_id 
      INTO v_id 
      FROM employees;
      DBMS_OUTPUT.PUT_LINE('Final do bloco 3');
    END;
    DBMS_OUTPUT.PUT_LINE('Final do bloco 2');
  END;
  DBMS_OUTPUT.PUT_LINE('Final do bloco 1');
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('ERRO!');
END;
/

E o retorno foi o seguinte:

Procedimento PL/SQL concluído com sucesso.

Inicio do bloco 1
Inicio do bloco 2
Inicio do bloco 3
ERRO!

O erro do bloco 3 foi lançado para o bloco 2 que por sua vez lançou para o bloco 1 e este recebeu o erro, parou a execução e tratou do erro.

Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com:
Publicado em Exceptions, PL/SQL

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Esse Blog é reconhecido pela
Certificações
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 138.077 Visualizações
%d blogueiros gostam disto: