Paquete DBMS_PIPE (tubos de mensajes persistentes)
El paquete DBMS_PIPE permite que se comuniquen dos o más sesiones en la misma instancia.
Oracle Autonomous AI Database on Dedicated Exadata Infrastructure admite la funcionalidad principal DBMS_PIPE disponible en Oracle Database 19c, además de las extensiones.
Consulte DBMS_PIPE en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 26ai PL/SQL Packages and Types Reference para obtener más información sobre la funcionalidad principal DBMS_PIPE proporcionada en Oracle Database.
Descripción general de DBMS_PIPE para pipelines de mensajería persistentes
La funcionalidad Pipe tiene varias aplicaciones potenciales: interfaz de servicio externo, depuración, transacciones independientes y alertas.
En la base de datos de IA autónoma, el paquete DBMS_PIPE tiene una funcionalidad ampliada para admitir canales de mensajería persistentes. Consulte DBMS_PIPE en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 26ai PL/SQL Packages and Types Reference para obtener más información.
Mensajes Persistentes en DBMS_PIPE:
-
Apoyar la capacidad de enviar y recuperar mensajes muy grandes.
-
Soporta un gran número de mensajes de conducción.
-
Compatibilidad con el uso compartido de mensajes en una única base de datos, en varias bases de datos y en distintas regiones.
-
Soporta varios pipes con el mismo URI de ubicación de almacenamiento de objetos en la nube.
La funcionalidad de mensajes persistentes permite que dos o más sesiones de base de datos se comuniquen con mensajes que se almacenan en el almacén de objetos en la nube. El uso de esta funcionalidad de mensajes 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 conducto de mensajería persistente puede ser cualquiera de los tipos de
DBMS_PIPEsoportados:-
Conducto implícito: se crea automáticamente cuando se envía un mensaje con un nombre de conducto desconocido mediante la función
DBMS_PIPE.SEND_MESSAGE. -
Conducto explícito: creado mediante la función
DBMS_PIPE.CREATE_PIPEcon un nombre de conducto especificado por el usuario. -
Pipa pública: accesible para cualquier usuario con permiso
EXECUTEen el paqueteDBMS_PIPE. -
Pipa privada: accesible por sesiones con el mismo usuario que el creador del pipeline. Nota: Cuando se envían y reciben mensajes en diferentes bases de datos mediante mensajes persistentes, Oracle recomienda llamar a
DBMS_PIPE.CREATE_PIPEantes de enviar o recibir mensajes. La creación de un conducto explícito conDBMS_PIPE.CREATE_PIPEgarantiza que se cree un conducto con los permisos de acceso que desee, ya sean públicos o privados (mediante la definición del parámetroPRIVATEenFALSEo el uso del valor por defectoTRUE).
-
Limitación DBMS_PIPE
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 base de datos de IA autónoma 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.
| Subprograma | Descripción |
|---|---|
| Función CREATE_PIPE | Crea una tubería (necesaria para tuberías privadas). |
| Función GET_CREDENTIAL_NAME | Devuelve el valor de variable global credential_name. |
| Función GET_LOCATION_URI | Devuelve el valor de variable global location_uri que se utiliza como URI de ubicación por defecto para su uso cuando se almacena un mensaje en el almacén de objetos en la nube. |
| Función NEXT_ITEM_TYPE |
Devuelve el tipo de dato del siguiente elemento del buffer. |
| Procedimientos PACK_MESSAGE |
Crea un mensaje en el buffer local. |
| Función RECEIVE_MESSAGE | Copia el mensaje del conducto con nombre en el buffer local. |
| Procedimiento RESET_BUFFER |
Depura el contenido del buffer local. |
| Función REMOVE_PIPE |
Elimina el conducto con nombre. |
| Función SEND_MESSAGE | Envía un mensaje en un conducto con nombre: esto crea implícitamente un conducto público si el conducto con nombre no existe. |
| Procedimiento SET_CREDENTIAL_NAME | Define la variable credential_name que se utiliza como credencial por defecto para los mensajes almacenados en el almacén de objetos en la nube. |
| Procedimiento SET_LOCATION_URI | Define la variable global location_uri que se utiliza como URI de ubicación por defecto para los mensajes almacenados en el almacén de objetos en la nube. |
| Función UNIQUE_SESSION_NAME |
Devuelve un nombre de sesión único. |
| Procedimientos UNPACK_MESSAGE |
Accede al siguiente elemento del buffer. |
Función CREATE_PIPE
Esta función crea explícitamente un conducto público o privado. Si el indicador private es TRUE, el creador del canal se asigna como propietario del canal privado.
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
| parámetro | Descripción |
|---|---|
pipename |
Nombre del conducto que está creando. Debe utilizar este nombre cuando llame a **Precaución:** No utilice nombres de conductos que comiencen por |
maxpipesize |
Tamaño máximo permitido para la conducción, en bytes. El tamaño total de todos los mensajes del conducto no puede superar esta cantidad. El mensaje se bloquea si supera este máximo. El valor por defecto de El El valor por defecto |
private |
Utiliza el valor por defecto, Las tuberías públicas se pueden crear implícitamente al llamar a |
Valores devueltos
| Return | Descripción |
|---|---|
0 |
Correcto. Si el conducto ya existe y el usuario que intenta crearlo está autorizado a utilizarlo, Oracle devuelve 0, lo que indica que se ha realizado correctamente, y cualquier dato que ya esté en el conducto permanece. |
ORA-23322 |
Error debido a un conflicto de nomenclatura. Si existe un conducto con el mismo nombre y lo ha creado un usuario diferente, Oracle indica el error |
Excepciones
| Excepción | Descripción |
|---|---|
Null pipe name |
Error de permiso: ya existe una pleca con el mismo nombre y no puede utilizarla. |
Ejemplo
Crear una privada explícita denominada 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 global credential_name 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 |
|---|---|
credential_name |
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 global location_uri que se puede utilizar como URI de ubicación por defecto cuando los mensajes de canal 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 |
|---|---|
pipename |
Nombre de la conducción en la que desea recibir un mensaje. Los nombres que empiecen por |
timeout |
Tiempo de espera para un mensaje, en segundos. Un timeout de 0 le permite leer sin bloqueo. El timeout no incluye el tiempo dedicado a ejecutar la función de caché especificada con el parámetro Valor predeterminado: es la constante |
credential_name |
Nombre de credencial del 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 que se utiliza 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 |
|---|---|
0 |
Correcto |
1 |
Timeout. Si la tubería se creó implícitamente y está vacía, se elimina. |
2 |
El registro en el conducto es demasiado grande para el buffer. |
3 |
Se produjo una interrupción. |
ORA-23322 |
El usuario no tiene suficientes privilegios para leer desde el conducto. |
Notas de uso
-
Para recibir un mensaje de un conducto, primero llame a
RECEIVE_MESSAGE. Cuando recibe un mensaje, se elimina del conducto; 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 eliminar el último registro de la tubería. -
Si el canal que especifique al llamar a
RECEIVE_MESSAGEno existe, Oracle crea el canal de forma implícita y espera a recibir el mensaje. Si el mensaje no llega dentro de un intervalo de tiempo de espera designado, se devuelve la llamada y se elimina la conducción. -
Después de recibir el mensaje, debe realizar una o más llamadas a
UNPACK_MESSAGEpara acceder a los elementos individuales del mensaje. El procedimientoUNPACK_MESSAGEse sobrecarga para desempaquetar artículos de tipoDATE,NUMBER,VARCHAR2y hay dos procedimientos adicionales para desempaquetar artículosRAWyROWID. Si no conoce el tipo de datos que está intentando desempaquetar, llame aNEXT_ITEM_TYPEpara determinar el tipo del siguiente elemento en el buffer. -
Se garantiza que los mensajes persistentes se escriban o lean exactamente mediante un proceso. Esto evita la inconsistencia del contenido del mensaje debido a escrituras y lecturas simultáneas. Mediante un conducto de mensajería persistente,
DBMS_PIPEsolo permite una operación, ya que el envío de un mensaje o un mensaje de recepción está activo en un momento determinado. Sin embargo, si no se puede realizar una operación 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 nativas de Oracle Cloud Infrastructure en el objeto de credencial.
-
Si utiliza el formato 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 |
|---|---|
Null pipe name |
Error de permiso. Privilegio insuficiente para eliminar el registro de la conducción. La tubería es propiedad de otra persona. |
Función SEND_MESSAGE
Esta función envía un mensaje en el conducto 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 del 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 que se utiliza para almacenar mensajes.
Puede definir este valor antes de llamar a |
maxpipesize |
Tamaño máximo permitido para la conducción, en bytes. El tamaño total de todos los mensajes del conducto no puede superar esta cantidad. El mensaje se bloquea si supera este máximo. El valor por defecto es 65536 bytes. El Al especificar El valor por defecto |
pipename |
Nombre de la conducción en la que desea colocar el mensaje. Si utiliza un conducto explícito, este es el nombre que especificó al llamar a **Precaución:** No utilice nombres de conductos que empiecen por ' |
timeout |
Tiempo de espera al intentar colocar un mensaje en un conducto, en segundos. El valor por defecto es la constante |
Valores devueltos
Tabla - Valores de retorno de función SEND_MESSAGE
| Return | Descripción |
|---|---|
0 |
Correcto. Si el conducto ya existe y el usuario que intenta crearlo está autorizado a utilizarlo, Oracle devuelve 0, lo que indica que se ha realizado correctamente, y cualquier dato que ya esté en el conducto permanece. Si un usuario conectado como |
1 |
Timeout. Este procedimiento puede agotar el tiempo de espera porque no puede obtener un bloqueo en el conducto o porque el conducto permanece demasiado lleno para ser utilizado. Si la tubería se creó implícitamente y está vacía, se elimina. |
3 |
Se produjo una interrupción. Si el conducto se creó implícitamente y está vacío, se elimina. |
ORA-23322 |
No dispone de privilegios suficientes. Si existe un conducto con el mismo nombre y lo ha creado un usuario diferente, Oracle indica el error |
Notas de uso
-
Se garantiza que los mensajes persistentes se escriban o lean exactamente mediante un proceso. Esto evita la inconsistencia del contenido del mensaje debido a escrituras y lecturas simultáneas. Mediante un conducto de mensajes persistente,
DBMS_PIPEsolo permite una operación, ya que el envío de un mensaje o un mensaje de recepción está activo en un momento determinado. Sin embargo, si no se puede realizar una operación 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 nativas de Oracle Cloud Infrastructure en el objeto de credencial.
-
Si utiliza el formato 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 |
|---|---|
Null pipe name |
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 canal 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 |
|---|---|
credential_name |
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 nativas de Oracle Cloud Infrastructure en el objeto de credencial.
-
Si utiliza el formato 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 global location_uri.
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 nativas de Oracle Cloud Infrastructure en el objeto de credencial.
-
Si utiliza el formato 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;
/