Paquete DBMS_PIPE (tuberías únicas)

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 tuberías únicas

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 tuberías singleton. 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.

Las funciones de tubería Singleton en DBMS_PIPE proporcionan lo siguiente:

Un tubo Singleton puede ser cualquiera de los tipos DBMS_PIPE soportados:

Resumen de subprogramas DBMS_PIPE para tubos singleton

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 NEXT_ITEM_TYPE

Devuelve el tipo de dato del siguiente elemento del buffer

Procedimientos PACK_MESSAGE

Crea un mensaje en el buffer local

Procedimiento de PURGE

Purga el contenido de la tubería con nombre
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 una canalización con nombre: esto crea implícitamente una canalización pública si la canalización con nombre no existe

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.

Para crear un tubo Singleton, defina el parámetro singleton en TRUE. Los siguientes argumentos son aplicables a Singleton Pipes:

Sintaxis

DBMS_PIPE.CREATE_PIPE (
   pipename     IN VARCHAR2,
   maxpipesize  IN INTEGER DEFAULT 66536,
   private      IN BOOLEAN DEFAULT TRUE,
   singleton    IN BOOLEAN DEFAULT FALSE,
   shelflife    IN INTEGER DEFAULT 0)
RETURN INTEGER;

Parámetros

parámetro Descripción
pipename

Nombre del conducto que está creando.

Debe utilizar este nombre cuando llame a SEND_MESSAGE y RECEIVE_MESSAGE. Este nombre debe ser único en la instancia.

Precaución: no utilice nombres de conducción que comiencen por ORA$. Se reservan para el uso mediante los procedimientos proporcionados por Oracle. El nombre de pipeline no debe tener más de 128 bytes y no es sensible a mayúsculas/minúsculas. En este momento, el nombre no puede contener caracteres de soporte de globalización.

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 maxpipesize es 66536 bytes.

El maxpipesize para una tubería se convierte en una parte de las características de la tubería y persiste durante la vida útil de la tubería. Los emisores de llamadas de SEND_MESSAGE con valores más grandes hacen que se aumente maxpipesize. Los emisores de llamadas con un valor menor utilizan el valor mayor existente.

El valor por defecto maxpipesize de 65536 se aplica a todos los pipes.

private

Utiliza el valor por defecto, TRUE, para crear un conducto privado.

Las tuberías públicas se pueden crear implícitamente al llamar a SEND_MESSAGE.

singleton

Utilice TRUE para crear un tubo Singleton.

Valor por defecto: FALSE

shelflife

Tiempo de caducidad en segundos de un mensaje almacenado en caché en Singleton Pipe. Una vez que se supera el tiempo especificado de shelflife, ya no se puede acceder al mensaje desde la pleca. El parámetro shelflife solo se aplica a un tubo de Singleton.

El valor por defecto es 0, lo que implica que el mensaje nunca caduca.

Valores devueltos

Return Descripción
0

Correcto.

Si la canalizació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 cualquier dato que ya esté en la canalización permanece.

6

Error al convertir el conducto existente en conducto singleton.

  • El conducto implícito con más de un mensaje existente no se puede convertir en un conducto singleton.
  • Para un conducto explícito que no es Singleton, DBMS_PIPE.SEND_MESSAGE no puede enviar un mensaje con el argumento singleton definido en TRUE.
7 Se proporciona un valor distinto de cero para el parámetro shelflife y el conducto no es un conducto singleton.
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 ORA-23322, que indica el conflicto de nomenclatura.

Excepciones

Excepción Descripción
Null pipe name Error de permiso: ya existe una pleca con el mismo nombre y no puede utilizarla.

Ejemplo

Cree una tubería Singleton con una vida útil de 1 hora.

DECLARE
  l_status INTEGER;
BEGIN
  l_status := DBMS_PIPE.create_pipe(pipename  => 'MY_PIPE1',
                                    private   => TRUE,
                                    singleton => TRUE,
                                    shelflife => 3600);
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,
   cache_func    IN VARCHAR2     DEFAULT NULL)
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 ORA$ están reservados para uso de Oracle.

timeout

Tiempo para esperar un mensaje, en segundos. Un timeout de 0 le permite leer sin bloqueo.

El timeout no incluye el tiempo empleado en la función de caché de ejecución especificada en el parámetro cache_func.

Valor predeterminado: es la constante MAXWAIT, que se define como 86400000 (1000 días).

cache_func

Nombre de función de caché para almacenar automáticamente en caché un mensaje en una pleca Singleton.

El nombre de la función debe estar totalmente cualificado con el esquema de propietario:

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

Valor por defecto: NULL

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.
8 La función de caché solo se puede especificar cuando se utiliza un tubo Singleton.
ORA-23322 El usuario no tiene suficientes privilegios para leer desde el conducto.

Notas de uso

Parámetro de función de caché

Singleton Pipes soporta la función de caché para almacenar automáticamente un mensaje en la canalización en caso de los dos escenarios siguientes:

El nombre de la función debe estar totalmente cualificado con el esquema de propietario:

Para utilizar una función de caché, el usuario de la sesión actual que llama a DBMS_PIPE.RECEIVE_MESSAGE debe tener los privilegios necesarios para ejecutar la función de caché.

Sintaxis de función de caché

CREATE OR REPLACE FUNCTION *cache_function_name* (
       pipename  IN VARCHAR2
) RETURN INTEGER;
parámetro Tipo de dato Descripción
pipename VARCHAR2 Nombre de la tubería Singleton.
Return Descripción
0 Correcto
No cero Valor de fallo devuelto de DBMS_PIPE.RECEIVE_MESSAGE

Definir una función de caché para proporcionar encapsulación y abstracción de la complejidad de las sesiones de lectura de Singleton Pipe. Las operaciones típicas dentro de una función de caché serían:

Excepciones

Excepción Descripción
Null pipe name Error de permiso. Privilegio insuficiente para eliminar el registro de la conducción. La pipa es propiedad de otra persona.

Ejemplo

DECLARE
  l_status INTEGER;
BEGIN
  l_status := DBMS_PIPE.receive_message(pipename   => 'MY_PIPE1',
                                        timeout    => 1,
                                        cache_func => 'MY_USER.MY_CACHE_FUNC');
END;
/

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.

Para crear un conducto Singleton implícito, defina el parámetro singleton en TRUE. Los siguientes argumentos son aplicables a Singleton Pipes:

Función CREATE_PIPE y será el valor por defecto para cualquier mensaje nuevo almacenado en caché en la pleca Singleton.

Sintaxis

DBMS_PIPE.SEND_MESSAGE (
    pipename     IN VARCHAR2,
    timeout      IN INTEGER DEFAULT MAXWAIT,
    maxpipesize  IN INTEGER DEFAULT 65536,
    singleton    IN BOOLEAN DEFAULT FALSE,
    shelflife    IN INTEGER DEFAULT 0)
RETURN INTEGER;

Parámetros

Tabla - Parámetros de función SEND_MESSAGE

parámetro Descripción
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 CREATE_PIPE.

**Precaución:** No utilice nombres de conductos que empiecen por 'ORA$'. Estos nombres están reservados para los procedimientos proporcionados por Oracle. El nombre de pipeline no debe tener más de 128 bytes y no es sensible a mayúsculas/minúsculas. En este momento, el nombre no puede contener caracteres de soporte de globalización.

timeout

Tiempo de espera al intentar colocar un mensaje en un conducto, en segundos.

El valor por defecto es la constante MAXWAIT, que se define como 86400000 (1000 días).

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 maxpipesize para una tubería se convierte en una parte de las características de la tubería y persiste durante la vida útil de la tubería. Los emisores de llamadas de SEND_MESSAGE con valores más grandes hacen que se aumente maxpipesize. Las personas que llaman con un valor más pequeño simplemente usan el valor existente, más grande.

Al especificar maxpipesize como parte del procedimiento SEND_MESSAGE, se elimina la necesidad de una llamada independiente para abrir el conducto. Si ha creado el conducto de forma explícita, puede utilizar el parámetro opcional maxpipesize para sustituir las especificaciones de tamaño del conducto de creación.

El valor por defecto maxpipesize de 65536 se aplica a todos los pipes.

singleton

Utilice TRUE para crear un tubo Singleton.

Valor por defecto: FALSE

shelflife

Tiempo de caducidad en segundos de un mensaje almacenado en caché en Singleton Pipe.

Una vez que se supera el tiempo especificado de shelflife, ya no se puede acceder al mensaje desde la pleca. El parámetro shelflife solo se aplica a un tubo de Singleton.

El valor por defecto es 0, lo que implica que el mensaje nunca caduca.

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.

Si un usuario conectado como SYSDBS/SYSOPER vuelve a crear un canal, Oracle devuelve el estado 0, pero la propiedad del canal no cambia.

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.

6

Error al convertir el conducto existente en conducto singleton.

  • El conducto implícito con más de un mensaje existente no se puede convertir en un conducto singleton.
  • Para un conducto explícito que no es Singleton, DBMS_PIPE.SEND_MESSAGE no puede enviar un mensaje con el argumento singleton definido en TRUE.
7 Se proporciona un valor distinto de cero para el parámetro shelflife y el conducto no es un conducto singleton.
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 ORA-23322, que indica el conflicto de nomenclatura.

Excepciones

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.

Contenido relacionado

Mensajes en caché con canalizaciones Singleton