Picture of Roberto Sobrinho
Roberto Sobrinho

09/07/2024

Propagação de Exceções em PL/SQL com Rotinas Encadeadas


A propagação de exceções é um conceito importante no desenvolvimento de PL/SQL, especialmente quando lidamos com rotinas encadeadas. Em situações complexas, é essencial entender como as exceções são tratadas e propagadas através das diferentes camadas de procedimentos e funções. Vamos explorar duas abordagens principais para lidar com exceções: permitir a propagação de erros e interceptar erros para tratamento específico.


    Criando um Exemplo Prático

    Para ilustrar a propagação de exceções, vamos criar três procedimentos: PRC_NIVEL_01, PRC_NIVEL_02 e PRC_NIVEL_03. Cada um desses procedimentos irá chamar o próximo nível, simulando uma cadeia de chamadas.

    Passo 1: Criar os Procedimentos

    Primeiramente, vamos criar os três procedimentos. No PRC_NIVEL_03, uma exceção será levantada intencionalmente.

    CREATE OR REPLACE PROCEDURE PRC_NIVEL_03 IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_03');
        RAISE_APPLICATION_ERROR(-20001, 'Erro intencional no PRC_NIVEL_03');
        DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_03');
    END PRC_NIVEL_03;
    /
    -- Procedure created.
    
    CREATE OR REPLACE PROCEDURE PRC_NIVEL_02 IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_02');
        PRC_NIVEL_03;
        DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_02');
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Erro capturado em PRC_NIVEL_02: ' || SQLERRM);
            RAISE;
    END PRC_NIVEL_02;
    /
    -- Procedure created.
    
    CREATE OR REPLACE PROCEDURE PRC_NIVEL_01 IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_01');
        PRC_NIVEL_02;
        DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_01');
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Erro capturado em PRC_NIVEL_01: ' || SQLERRM);
    END PRC_NIVEL_01;
    /
    -- Procedure created.

    Passo 2: Executar o Procedimento Principal

    Vamos executar o PRC_NIVEL_01 para observar o comportamento das exceções através da cadeia de chamadas.

    BEGIN
        PRC_NIVEL_01;
    END;
    /

    Neste exemplo, o erro é propagado do PRC_NIVEL_03 para o PRC_NIVEL_02 e finalmente para o PRC_NIVEL_01, onde é tratado.

    Tratando o Erro Internamente

    Agora, vamos modificar o PRC_NIVEL_02 para tratar o erro internamente e evitar que ele seja propagado para PRC_NIVEL_01.

    CREATE OR REPLACE PROCEDURE PRC_NIVEL_02 IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_02');
        PRC_NIVEL_03;
        DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_02');
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Erro tratado em PRC_NIVEL_02: ' || SQLERRM);
    END PRC_NIVEL_02;
    /
    -- Procedure created.

    Executando novamente o PRC_NIVEL_01:

    BEGIN
        PRC_NIVEL_01;
    END;
    /

    Com essa modificação, o PRC_NIVEL_02 trata o erro internamente, evitando que ele chegue ao PRC_NIVEL_01.


    Com base nos exemplos acima, podemos concluir que o comportamento das exceções em rotinas encadeadas depende de como elas são tratadas em cada nível. Se o erro for tratado internamente, ele não será propagado para o chamador. Caso contrário, ele continuará subindo pela cadeia de chamadas até encontrar um bloco de tratamento adequado. Essa abordagem permite um controle fino sobre o fluxo de exceções, permitindo ações específicas em diferentes níveis da aplicação.


    🐓🫥 #20240709 #GuinaNãoTinhaDó #SeReagirBúmViraPó #GalgarPedra #AjudaODBA #DBAHerói #FitaLoka #MetaTomarSeuLugar #QueFita #VidaBandida #DinheiroNaMão #SeguroVaiCobrir #MundoMágicoOZ #GuinaNoPortão 🫥🐓



    Compartilhe

    Facebook
    Twitter
    LinkedIn
    WhatsApp
    Email
    Print

    Pesquisar

    Roberto Sobrinho

    Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

    Oracle ACE Associate

    2025

    Specialist

    Exadata Database Machine X9M

    Professional

    Oracle Database Administration

    Professional

    Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

    Professional

    Oracle Autonomous Database Cloud

    Professional

    Oracle Cloud Database Migration and Integration

    Professional

    Oracle Database PL/SQL Developer

    Associate

    Oracle Cloud Infrastructure Architect

    Associate

    Oracle Cloud Infrastructure Foundations

    Categorias

    Categorias

    Tags

    Propagação de Exceções em PL/SQL com Rotinas Encadeadas