Pular para o conteúdo

DBMS_PIPE: Comunicação entre Sessões via “Pipes” no PL/SQL

DBMS_PIPE: Comunicação entre Sessões via “Pipes” no PL/SQL

Introdução

A comunicação eficiente entre sessões é essencial em ambientes de banco de dados, especialmente quando se trata de sistemas complexos. O Oracle PL/SQL fornece uma solução poderosa para esse desafio por meio do pacote DBMS_PIPE. Este artigo explora o conceito de comunicação entre sessões utilizando “pipes” no PL/SQL e fornece exemplos práticos para ilustrar sua aplicação.

O que são “Pipes” no contexto do Oracle PL/SQL? Os “pipes” (tubulações) são canais de comunicação que permitem a transferência de dados entre diferentes sessões no Oracle. O pacote DBMS_PIPE oferece uma interface para criar, escrever e ler dados desses canais, facilitando a comunicação assíncrona entre sessões.

Utilizando o DBMS_PIPE

Para começar, é necessário criar um pipe. Isso pode ser feito com a seguinte instrução:

EXEC DBMS_PIPE.CREATE_PIPE('MEU_PIPE', 'OUT');

Neste exemplo, um pipe chamado ‘MEU_PIPE’ é criado para operações de saída. Uma vez criado, os dados podem ser escritos no pipe:

EXEC DBMS_PIPE.SEND_MESSAGE('MEU_PIPE', 'Olá, Mundo!');

Agora, em uma sessão diferente, os dados podem ser lidos do mesmo pipe:

DECLARE
   mensagem VARCHAR2(200);
BEGIN
   DBMS_PIPE.RECEIVE_MESSAGE('MEU_PIPE', 10); -- 10 é o timeout em segundos
   DBMS_PIPE.UNPACK_MESSAGE(mensagem);
   DBMS_OUTPUT.PUT_LINE('Mensagem Recebida: ' || mensagem);
END;

Exemplo Prático

Vamos considerar um cenário em que temos um processo PL/SQL que executa uma tarefa demorada e desejamos monitorar seu progresso a partir de outra sessão. Vamos criar um exemplo simples com dois scripts:

Script 1 – Produtor.sql

-- Produtor.sql
DECLARE
   meu_pipe VARCHAR2(30) := 'MEU_PIPE';
BEGIN
   DBMS_PIPE.CREATE_PIPE(meu_pipe, 'OUT');

   FOR i IN 1..10 LOOP
      -- Simula uma tarefa demorada
      DBMS_LOCK.SLEEP(5);

      -- Envia o progresso para o pipe
      DBMS_PIPE.SEND_MESSAGE(meu_pipe, 'Progresso: ' || i);
   END;

   -- Indica o término da tarefa
   DBMS_PIPE.SEND_MESSAGE(meu_pipe, 'Tarefa Concluída');

   -- Fecha o pipe
   DBMS_PIPE.REMOVE_PIPE(meu_pipe);
END;
/
PL/SQL procedure successfully completed.

Script 2 – Consumidor.sql

-- Consumidor.sql
DECLARE
   meu_pipe VARCHAR2(30) := 'MEU_PIPE';
   mensagem VARCHAR2(200);
BEGIN
   -- Aguarda a mensagem por até 60 segundos
   DBMS_PIPE.RECEIVE_MESSAGE(meu_pipe, 60);

   -- Desempacota a mensagem
   DBMS_PIPE.UNPACK_MESSAGE(mensagem);

   -- Exibe a mensagem recebida
   DBMS_OUTPUT.PUT_LINE('Mensagem Recebida: ' || mensagem);
END;
/
Mensagem Recebida: Progresso: 1
Mensagem Recebida: Progresso: 2
Mensagem Recebida: Progresso: 3
Mensagem Recebida: Progresso: 4
Mensagem Recebida: Progresso: 5
Mensagem Recebida: Progresso: 6
Mensagem Recebida: Progresso: 7
Mensagem Recebida: Progresso: 8
Mensagem Recebida: Progresso: 9
Mensagem Recebida: Progresso: 10
Mensagem Recebida: Tarefa Concluída

Ao executar o script “Produtor.sql”, ele enviará mensagens de progresso para o pipe. Enquanto isso, ao executar o script “Consumidor.sql”, ele esperará até 60 segundos para receber e exibir a mensagem no console.

Conclusão

O uso do DBMS_PIPE para comunicação entre sessões via “pipes” oferece uma maneira eficaz de transmitir dados entre diferentes partes de uma aplicação no ambiente Oracle. Este artigo forneceu uma introdução prática ao conceito, juntamente com exemplos que demonstram a aplicação real dessa técnica. Ao incorporar o DBMS_PIPE em suas estratégias de comunicação, os desenvolvedores PL/SQL podem melhorar a eficiência e a colaboração em ambientes complexos de banco de dados Oracle.

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