Paquete DBMS_PIPE (tubos de mensajes persistentes)
DBMS_PIPE
permite que se comuniquen dos o más sesiones de la misma instancia.
Oracle Autonomous Database on Dedicated Exadata Infrastructure soporta la funcionalidad principal DBMS_PIPE
, como está disponible en Oracle Database 19c, además de extensiones.
Consulte DBMS_PIPE en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference para obtener más información sobre la funcionalidad principal DBMS_PIPE
proporcionada en Oracle Database.
DBMS_PIPE Visión General de Pipes de Mensajería Persistente
La funcionalidad de canalización tiene varias aplicaciones potenciales: interfaz de servicio externo, depuración, transacciones independientes y alertas.
En Autonomous Database, el paquete DBMS_PIPE tiene una funcionalidad ampliada para soportar pipes de mensajería persistentes. Consulte DBMS_PIPE en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference para obtener más información.
Mensajes persistentes en DBMS_PIPE
:
-
Apoya la capacidad de enviar y recuperar mensajes muy grandes.
-
Soporta un gran número de mensajes de canal.
-
Admita el uso compartido de mensajes dentro de una única base de datos, entre varias bases de datos y entre bases de datos de diferentes regiones.
-
Soporta varios pipes con el mismo URI de ubicación del almacén de objetos en la nube.
La funcionalidad de mensajería persistente permite que dos o más sesiones de base de datos se comuniquen con los mensajes almacenados en el almacén de objetos en la nube. El uso de estos mensajes de funcionalidad en un conducto solo puede estar disponible para la base de datos actual o puede estar disponible para varias bases de datos en la misma región o en diferentes regiones.
Un tubo de mensajería persistente puede ser cualquiera de los tipos
DBMS_PIPE
soportados:- Conducta implícita: se crea automáticamente cuando se envía un mensaje con un nombre de conducto desconocido mediante la función
DBMS_PIPE.SEND_MESSAGE
. - Pipa explícita: se crea mediante la función
DBMS_PIPE.CREATE_PIPE
con un nombre de pipa especificado por el usuario. - Conducta pública: accesible para cualquier usuario con permiso
EXECUTE
en el paqueteDBMS_PIPE
. - Dirección privada: accesible para sesiones con el mismo usuario que el creador de la conducción.
- Conducta implícita: se crea automáticamente cuando se envía un mensaje con un nombre de conducto desconocido mediante la función
Note:
Al enviar y recibir mensajes en distintas bases de datos mediante mensajes persistentes, Oracle recomienda llamar aDBMS_PIPE.CREATE_PIPE
antes de enviar o recibir mensajes. La creación de una conducción explícita con DBMS_PIPE.CREATE_PIPE
garantiza que se cree una conducción con los permisos de acceso que desee, ya sean públicos o privados (definiendo el parámetro PRIVATE
en FALSE
o utilizando el valor por defecto TRUE
).
DBMS_PIPE Limitación
El paquete DBMS_PIPE
no soporta el envío de mensajes entre bases de datos que utilizan diferentes juegos de caracteres. Por ejemplo, si tiene una instancia de Autonomous Database que utiliza AL32UTF8 y otra instancia que utiliza WE8MSWIN1252, no puede enviar mensajes con DBMS_PIPE
entre estas dos bases de datos. En este caso, el sistema emitirá el error ORA-12704
si intenta enviar mensajes con DBMS_PIPE
entre estas dos bases de datos.
Resumen de Subprogramas DBMS_PIPE para Mensajería Persistente
En esta tabla se muestran los subprogramas DBMS_PIPE
y se describen brevemente.
Tabla: Subprogramas de Paquete DBMS_PIPE
Subprograma | Descripción |
---|---|
Crea una tubería (necesaria para tuberías privadas). |
|
Devuelve el valor de la variable |
|
Devuelve el valor de variable |
|
Devuelve el tipo de dato del siguiente elemento en el buffer. |
|
Crea el mensaje en el buffer local. |
|
Copia el mensaje del conducto con nombre en el buffer local. |
|
Depura el contenido del buffer local. |
|
Elimina la conducción con nombre. |
|
Envía un mensaje en una conducción con nombre: esto crea implícitamente una conducción pública si la conducción con nombre no existe. |
|
Define la variable |
|
Define la variable |
|
Devuelve un nombre de sesión único. |
|
UNPACK_MESSAGE Procedimientos
|
Accede al siguiente elemento en el buffer. |
Función CREATE_PIPE
Esta función crea explícitamente una conducción pública o privada. Si el indicador private
es TRUE
, el creador de la conducción se asigna como propietario de la conducción privada.
Los pipes creados explícitamente solo se pueden eliminar llamando a REMOVE_PIPE
o cerrando la instancia.
Sintaxis
DBMS_PIPE.CREATE_PIPE ( pipename IN VARCHAR2, maxpipesize IN INTEGER DEFAULT 66536, private IN BOOLEAN DEFAULT TRUE) RETURN INTEGER;
Parámetros
Tabla - Parámetros de función CREATE_PIPE
parámetro | Descripción |
---|---|
|
Nombre del conducto que está creando. Debe utilizar este nombre al llamar a Precaución: No utilice nombres de conducción que comiencen por |
|
Tamaño máximo permitido para la conducción, en bytes. El tamaño total de todos los mensajes de la conducción no puede superar esta cantidad. El mensaje se bloquea si supera este máximo. El valor por defecto
El valor por defecto |
|
Utiliza el valor por defecto, Los pipes públicos se pueden crear implícitamente al llamar a |
Valores devueltos
Tabla: Valores de Retorno de Función CREATE_PIPE
Return | Descripción |
---|---|
|
Correcto. Si la conducción ya existe y el usuario que intenta crearla está autorizado a utilizarla, Oracle devuelve 0, lo que indica que se ha realizado correctamente, y los datos que ya estén en la conducción permanecen. |
|
Fallo debido a un conflicto de nombres. Si existe una conducción con el mismo nombre y la ha creado un usuario diferente, Oracle señala el error |
Excepciones
Tabla - Excepción de función CREATE_PIPE
Excepción | Descripción |
---|---|
|
Error de permiso: Ya existe un conducto con el mismo nombre y no puede utilizarlo. |
Ejemplo
Crear un privado explícito denominado MY_PIPE1
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(
pipename => 'MY_PIPE1',
private => TRUE);
END;
/
Función GET_CREDENTIAL_NAME
Esta función devuelve el valor de variable credential_name
global para su uso cuando los mensajes se almacenan en el almacén de objetos en la nube.
Sintaxis
DBMS_PIPE.GET_CREDENTIAL_NAME RETURN VARCHAR2;
Valores devueltos
Valor devuelto | Descripción |
---|---|
|
Nombre de la credencial para acceder a Cloud Object Storage. |
Ejemplo
DECLARE
credential_name VARCHAR2(400)
BEGIN
credential_name := DBMS_PIPE.GET_CREDENTIAL_NAME;
END;
/
Función GET_LOCATION_URI
Esta función devuelve el valor de variable location_uri
global que se puede utilizar como URI de ubicación por defecto cuando los mensajes de conducción se almacenan en el almacén de objetos en la nube.
Sintaxis
DBMS_PIPE.GET_LOCATION_URI RETURN VARCHAR2;
Valor devuelto
Valor devuelto | Descripción |
---|---|
location_uri |
URI del objeto. |
Ejemplo
DECLARE
location_uri VARCHAR2(400)
BEGIN
location_uri := DBMS_PIPE.GET_LOCATION_URI;
END;
/
Función RECEIVE_MESSAGE
Esta función copia el mensaje en el buffer de mensajes local.
Sintaxis
DBMS_PIPE.RECEIVE_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT maxwait, credential_name IN VARCHAR2 DEFAULT null, location_uri IN VARCHAR2) RETURN INTEGER;
Parámetros
Tabla - Parámetros de función RECEIVE_MESSAGE
parámetro | Descripción |
---|---|
|
Nombre del conducto en el que desea recibir un mensaje. Los nombres que empiezan por |
|
Tiempo de espera de un mensaje, en segundos. Un timeout de 0 le permite leer sin bloqueos. El timeout no incluye el tiempo empleado en ejecutar la función de caché especificada con el parámetro Valor por defecto: es la constante |
|
Nombre de credencial para el almacén en la nube utilizado para almacenar mensajes.
Puede definir este valor antes de llamar a El objeto de credencial debe tener privilegios |
|
URI de ubicación del almacén en la nube utilizado para almacenar mensajes.
Puede definir este valor antes de llamar a |
Valores devueltos
Tabla: Valores de Retorno de Función RECEIVE_MESSAGE
Return | Descripción |
---|---|
|
Correcto |
|
Timeout. Si la conducción se ha creado implícitamente y está vacía, se elimina. |
|
El registro en el conducto es demasiado grande para el buffer. |
|
Se ha producido una interrupción. |
|
El usuario no tiene suficientes privilegios para leer desde el conducto. |
Notas de uso
-
Para recibir un mensaje de un conducto, llame primero a
RECEIVE_MESSAGE
. Cuando recibe un mensaje, se elimina de la conducción; por lo tanto, un mensaje solo se puede recibir una vez. Para las tuberías creadas implícitamente, la tubería se elimina después de que se elimina el último registro de la tubería. -
Si la conducción que especifique al llamar a
RECEIVE_MESSAGE
aún no existe, Oracle crea implícitamente la conducción y espera a recibir el mensaje. Si el mensaje no llega dentro de un intervalo de timeout designado, la llamada vuelve y se elimina la conducción. -
Después de recibir el mensaje, debe realizar una o más llamadas a
UNPACK_MESSAGE
para acceder a los elementos individuales del mensaje. El procedimientoUNPACK_MESSAGE
está sobrecargado para desempaquetar elementos de tipoDATE
,NUMBER
,VARCHAR2
y hay dos procedimientos adicionales para desempaquetar elementosRAW
yROWID
. Si no conoce el tipo de datos que está intentando desempaquetar, llame aNEXT_ITEM_TYPE
para determinar el tipo del siguiente elemento en el buffer. -
Se garantiza que los mensajes persistentes se escriban o lean exactamente en un proceso. Esto evita la inconsistencia de contenido del mensaje debido a escrituras y lecturas simultáneas. Mediante un conducto de mensajes persistente,
DBMS_PIPE
solo permite que una operación, el envío de un mensaje o un mensaje de recepción estén activos en un momento determinado. Sin embargo, si una operación no es posible debido a una operación en curso, el proceso se reintenta periódicamente hasta que se alcanza el valortimeout
. -
Si utiliza Oracle Cloud Infrastructure Object Storage para almacenar mensajes, puede utilizar los URI nativos de Oracle Cloud Infrastructure o los URI de Swift. Sin embargo, el URI de ubicación y la credencial deben coincidir en el tipo de la siguiente manera:
-
Si utiliza un formato de URI nativo para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar la autenticación de claves de firma de Oracle Cloud Infrastructure nativa en el objeto de credencial.
-
Si utiliza el formato de URI de Swift para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar una autenticación de token de autenticación en el objeto de credencial.
-
Excepciones
Tabla: excepciones de función RECEIVE_MESSAGE
Excepción | Descripción |
---|---|
|
Error de permiso. Privilegio insuficiente para eliminar el registro de la conducción. La pipa es propiedad de otra persona. |
Función SEND_MESSAGE
Esta función envía un mensaje en la conducción con nombre.
El mensaje está incluido en el buffer de mensajes local, que se ha rellenado con llamadas a PACK_MESSAGE
. Puede crear un conducto explícitamente mediante CREATE_PIPE
; de lo contrario, se crea implícitamente.
Sintaxis
DBMS_PIPE.SEND_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT MAXWAIT, credential_name IN VARCHAR2 DEFAULT null, location_uri IN VARCHAR2 ) RETURN INTEGER;
Parámetros
Tabla - Parámetros de función SEND_MESSAGE
parámetro | Descripción |
---|---|
credential_name |
Nombre de credencial para el almacén en la nube utilizado para almacenar mensajes.
Puede definir este valor antes de llamar a El objeto de credencial debe tener privilegios |
location_uri |
URI de ubicación del almacén en la nube utilizado para almacenar mensajes.
Puede definir este valor antes de llamar a |
|
Tamaño máximo permitido para el conducto, en bytes. El tamaño total de todos los mensajes de la conducción no puede superar esta cantidad. El mensaje se bloquea si supera este máximo. El valor por defecto es 65536 bytes.
La especificación de El valor por defecto |
|
Nombre del conducto en el que desea colocar el mensaje. Si está utilizando una conducción explícita, este es el nombre que especificó al llamar a Precaución: No utilice nombres de conducción que comiencen por ' |
|
Tiempo de espera al intentar colocar un mensaje en una conducción, en segundos. El valor por defecto es la constante |
Valores devueltos
Tabla: Valores de Retorno de Función SEND_MESSAGE
Return | Descripción |
---|---|
|
Correcto. Si la conducción ya existe y el usuario que intenta crearla está autorizado a utilizarla, Oracle devuelve 0, lo que indica que se ha realizado correctamente, y los datos que ya estén en la conducción permanecen. Si un usuario conectado como |
|
Timeout. Este procedimiento puede agotar el tiempo de espera ya sea porque no puede obtener un bloqueo en el conducto o porque el conducto permanece demasiado lleno para ser utilizado. Si la conducción se ha creado implícitamente y está vacía, se elimina. |
|
Se ha producido una interrupción. Si la conducción se ha creado implícitamente y está vacía, se elimina. |
|
Privilegios insuficientes. Si existe una conducción con el mismo nombre y la ha creado un usuario diferente, Oracle señala el error |
Notas de uso
-
Se garantiza que los mensajes persistentes se escriban o lean exactamente en un proceso. Esto evita la inconsistencia de contenido del mensaje debido a escrituras y lecturas simultáneas. Mediante un conducto de mensajes persistente,
DBMS_PIPE
solo permite que una operación, el envío de un mensaje o un mensaje de recepción estén activos en un momento determinado. Sin embargo, si una operación no es posible debido a una operación en curso, el proceso se reintenta periódicamente hasta que se alcanza el valortimeout
. -
Si utiliza Oracle Cloud Infrastructure Object Storage para almacenar mensajes, puede utilizar los URI nativos de Oracle Cloud Infrastructure o los URI de Swift. Sin embargo, el URI de ubicación y la credencial deben coincidir en el tipo de la siguiente manera:
-
Si utiliza un formato de URI nativo para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar la autenticación de claves de firma de Oracle Cloud Infrastructure nativa en el objeto de credencial.
-
Si utiliza el formato de URI de Swift para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar una autenticación de token de autenticación en el objeto de credencial.
-
Excepciones
Tabla - Excepción de función SEND_MESSAGE
Excepción | Descripción |
---|---|
|
Error de permiso. Privilegio insuficiente para escribir en el conducto. La tubería es privada y propiedad de otra persona. |
Procedimiento SET_CREDENTIAL_NAME
Este procedimiento define la variable credential_name
que se utiliza como credencial por defecto cuando los mensajes de conducción se almacenan en el almacén de objetos en la nube.
Sintaxis
DBMS_PIPE.SET_CREDENTIAL_NAME ( credential_name IN VARCHAR2 );
Parámetros
parámetro | Descripción |
---|---|
|
Nombre de la credencial para acceder a Cloud Object Storage. |
Notas de uso
Si utiliza Oracle Cloud Infrastructure Object Storage para almacenar mensajes, puede utilizar los URI nativos de Oracle Cloud Infrastructure o los URI de Swift. Sin embargo, el URI de ubicación y la credencial deben coincidir en el tipo de la siguiente manera:
-
Si utiliza un formato de URI nativo para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar la autenticación de claves de firma de Oracle Cloud Infrastructure nativa en el objeto de credencial.
-
Si utiliza el formato de URI de Swift para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar una autenticación de token de autenticación en el objeto de credencial.
Ejemplo
BEGIN
DBMS_PIPE.SET_CREDENTIAL_NAME(
credential_name => 'my_cred1');
END;
/
Procedimiento SET_LOCATION_URI
Este procedimiento define la variable location_uri
global.
Sintaxis
DBMS_PIPE.SET_LOCATION_URI ( location_uri IN VARCHAR2 );
parámetro
parámetro | Descripción |
---|---|
location_uri |
URI de archivo o de objeto. El formato del URI depende del servicio de Cloud Object Storage que utilice. Para obtener más información, consulte Formatos de URI de almacenamiento de objetos en la nube. |
Notas de uso
Si utiliza Oracle Cloud Infrastructure Object Storage para almacenar mensajes, puede utilizar los URI nativos de Oracle Cloud Infrastructure o los URI de Swift. Sin embargo, el URI de ubicación y la credencial deben coincidir en el tipo de la siguiente manera:
-
Si utiliza un formato de URI nativo para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar la autenticación de claves de firma de Oracle Cloud Infrastructure nativa en el objeto de credencial.
-
Si utiliza el formato de URI de Swift para acceder a Oracle Cloud Infrastructure Object Storage, debe utilizar una autenticación de token de autenticación en el objeto de credencial.
Ejemplo
BEGIN
DBMS_PIPE.GET_LOCATION_URI(
location_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/');
END;
/