Saltar al contenido

Paquete DBMS_PIPE | Envío de mensajes

DBMS_PIPE

El paquete DBMS_PIPE proporciona un mecanismo no seguro para mandar mensajes entre sesiones.
Se considera no seguro porque los mensajes se pueden perder si la instancia se bloquea o se apaga antes de que sean procesados.

Aquí os dejo un ejemplo comentado:

En la primera sesión:

DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.CREATE_PIPE (pipename => ‘TEST_PIPE’,
maxpipesize => 8192, private => FALSE);
— Es recomendable borrar el contenido del buffer local
DBMS_PIPE.RESET_BUFFER;
DBMS_PIPE.PACK_MESSAGE(item => ‘Mi primer mensaje’);
— Podemos meterle el mensaje también asi
–DBMS_PIPE.PACK_MESSAGE(cadena);
— Podemos poner ademas el tiempo, si no se pone nada son 1000 días. El tiempo va en segundos
— y el tamaño máximo del mensaje (maximo 4096)
— Se vacia el buffer local cuando se envia
l_status := DBMS_PIPE.SEND_MESSAGE(pipename => ‘TEST_PIPE’);
— Borramos la tuberia
–DBMS_PIPE.PURGE(‘TEST_PIPE’);
–l_status := DBMS_PIPE.REMOVE_PIPE (pipename => ‘TEST_PIPE’);

EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(‘SQLERRM: ‘ || SQLERRM);
DBMS_OUTPUT.PUT_LINE(‘SQLCODE: ‘ || SQLCODE);
END;


En la otra session:

DECLARE
l_received_message VARCHAR2(128);
l_message_type NUMBER(2);
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.RECEIVE_MESSAGE(pipename => ‘TEST_PIPE’);
— Nos devolvera los siguientes valores dependiendo del mensaje
— 0 nada, 6 number, 9 varchar2, 11 ROWID, 12 DATE, 23 RAW
— Si esperamos mas tipos de datos haremos un case

l_message_type := DBMS_PIPE.NEXT_ITEM_TYPE;
LOOP
IF (l_message_type = 9) THEN
— Esto lo debemos hacer hasta que el NEXT_ITEM_TYPE sea 0
— lo que quiere decir que no hay mas elementos
DBMS_PIPE.UNPACK_MESSAGE(item => l_received_message);
dbms_output.put_line(l_received_message);

ELSE
exit;
END IF;
END LOOP;
— CUANDO LO RECIBO NO PUEDO VOLVER A RECUPERARLO
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(‘SQLERRM: ‘ || SQLERRM);
DBMS_OUTPUT.PUT_LINE(‘SQLCODE: ‘ || SQLCODE);
END;