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
- Oracle Database PL/SQL Language Reference: https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/index.html (Documentação oficial da linguagem PL/SQL do Oracle, fornecendo informações detalhadas sobre os recursos e funcionalidades da linguagem.)
- Oracle Database PL/SQL Packages and Types Reference – DBMS_PIPE: DBMS_PIPE (oracle.com) Informações detalhadas sobre o pacote
DBMS_PIPE
, incluindo suas funções e procedimentos para comunicação assíncrona.) - Oracle Database PL/SQL Packages and Types Reference – DBMS_SCHEDULER: https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SCHEDULER.html (Documentação oficial do pacote
DBMS_SCHEDULER
, que também oferece recursos para criar processos assíncronos.) - Oracle Database PL/SQL Packages and Types Reference – DBMS_JOB: https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_JOB.html (Documentação oficial do pacote
DBMS_JOB
, com informações sobre sua utilização para criação de processos assíncronos.)