Pular para o conteúdo

Processo Assíncrono no PL/SQL: Explorando DBMS_PIPE com DBMS_SCHEDULER e DBMS_JOB

Explorando DBMS_PIPE com DBMS_SCHEDULER e DBMS_JOB

O PL/SQL é uma extensão do SQL utilizada no Oracle para criar procedimentos armazenados, funções e outros blocos de código. Em muitas situações, é desejável executar tarefas em segundo plano, de forma assíncrona, sem bloquear o fluxo principal do programa. Neste artigo, vamos explorar o uso do DBMS_PIPE em conjunto com o DBMS_SCHEDULER e o DBMS_JOB para criar processos assíncronos no PL/SQL. Aprenderemos como utilizar esses recursos para agendar e executar tarefas de forma independente, melhorando a eficiência e a responsividade de nossos aplicativos.

Processo Assíncrono com DBMS_PIPE

O DBMS_PIPE é um mecanismo poderoso no Oracle que permite a comunicação assíncrona entre sessões do banco de dados. Com o DBMS_PIPE, é possível enviar e receber mensagens entre diferentes blocos de código de forma assíncrona, sem que eles tenham que esperar a conclusão de cada tarefa.

Exemplo Prático: Comunicação Assíncrona com DBMS_PIPE

Vamos criar um exemplo prático que demonstra como usar o DBMS_PIPE para realizar uma comunicação assíncrona entre dois blocos de código.

Procedimento Produtor
CREATE OR REPLACE PROCEDURE produtor AS
BEGIN
  DBMS_PIPE.CREATE_PIPE('MEU_PIPE');
  DBMS_PIPE.PACK_MESSAGE('Mensagem de teste');
  DBMS_PIPE.SEND_MESSAGE('MEU_PIPE');
  DBMS_PIPE.REMOVE_PIPE('MEU_PIPE');
END;
Procedimento Consumidor
CREATE OR REPLACE PROCEDURE consumidor AS
  v_message VARCHAR2(100);
BEGIN
  DBMS_PIPE.RECEIVE_MESSAGE('MEU_PIPE', 10); -- Timeout de 10 segundos
  DBMS_PIPE.UNPACK_MESSAGE(v_message);
  DBMS_OUTPUT.PUT_LINE('Mensagem recebida: ' || v_message);
END;

Neste exemplo, o procedimento produtor envia a mensagem “Mensagem de teste” usando o DBMS_PIPE, enquanto o procedimento consumidor aguarda e recebe a mensagem usando o mesmo pipe. Essa comunicação é assíncrona, permitindo que os dois procedimentos sejam executados independentemente.

Processo Assíncrono com DBMS_SCHEDULER

O DBMS_SCHEDULER é uma ferramenta no Oracle que permite agendar e executar tarefas de forma assíncrona. Ele pode ser usado em conjunto com o DBMS_PIPE para criar tarefas agendadas que executam a comunicação assíncrona.

Exemplo Prático: Inserção Assíncrona de Registros com DBMS_SCHEDULER e DBMS_PIPE
-- Procedimento para inserção assíncrona
CREATE OR REPLACE PROCEDURE inserir_registro(p_id NUMBER, p_nome VARCHAR2) AS
BEGIN
  INSERT INTO minha_tabela (id, nome) VALUES (p_id, p_nome);
  COMMIT;
END;

-- Criação do Job Agendado Assíncrono usando o DBMS_SCHEDULER e DBMS_PIPE
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'JOB_INSERCAO_ASSINCRONA',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN produtor; END;', -- Executa o procedimento produtor
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=5', -- A cada 5 minutos
    enabled         => TRUE
  );
END;
/

Neste exemplo, criamos um job agendado chamado “JOB_INSERCAO_ASSINCRONA” que será executado a cada 5 minutos. Esse job chama o procedimento produtor, que envia uma mensagem usando o DBMS_PIPE, criando assim uma comunicação assíncrona.

Processo Assíncrono com DBMS_JOB (Deprecado a partir do Oracle 12c)

Antes do Oracle 12c, o DBMS_JOB era comumente usado para criar processos assíncronos. Embora seja considerado obsoleto a partir do Oracle 12c, ainda pode ser relevante em versões mais antigas.

Exemplo Prático: Inserção Assíncrona de Registros com DBMS_JOB e DBMS_PIPE
-- Procedimento para inserção assíncrona
CREATE OR REPLACE PROCEDURE inserir_registro(p_id NUMBER, p_nome VARCHAR2) AS
BEGIN
  INSERT INTO minha_tabela (id, nome) VALUES (p_id, p_nome);
  COMMIT;
END;

-- Criação do Job Assíncrono usando o DBMS_JOB e DBMS_PIPE
DECLARE
  v_job NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(v_job, 'produtor;', SYSTIMESTAMP, 'SYSTIMESTAMP + INTERVAL ''5'' MINUTE');
  COMMIT;
END;
/

Neste exemplo, usamos o DBMS_JOB para criar um job assíncrono que chama o procedimento produtor a cada 5 minutos. Esse procedimento, por sua vez, envia uma mensagem usando o DBMS_PIPE, criando uma comunicação assíncrona.

Neste artigo, exploramos três abordagens para criar processos assíncronos no PL/SQL usando o DBMS_PIPE, DBMS_SCHEDULER e DBMS_JOB. Cada método tem suas vantagens e pode ser usado de acordo com os requisitos específicos da aplicação e a versão do Oracle. Utilizar processos assíncronos é uma maneira eficaz de melhorar a eficiência e a responsividade de nossos aplicativos, permitindo a execução de tarefas em segundo plano sem interromper o fluxo principal do programa.

Abs

Referências

Giovano Silva

Giovano Silva

Giovano Silva é um profissional com mais de 10 anos de experiência em tecnologias Oracle, com ênfase em PL/SQL. Ele adora escrever sobre soluções para problemas comuns enfrentados por profissionais Oracle em seu dia a dia. Seu objetivo é compartilhar conhecimento, simplificar conceitos complexos e ajudar a comunidade Oracle a crescer coletivamente.

Deixe um comentário

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

plugins premium WordPress