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