Package DBMS_PIPE (Singleton Pipes)

Le package DBMS_PIPE permet à plusieurs sessions de la même instance de communiquer.

Oracle Autonomous AI Database on Dedicated Exadata Infrastructure prend en charge les fonctionnalités DBMS_PIPE de base telles qu'elles sont disponibles dans Oracle Database 19c, ainsi que les extensions.

Reportez-vous à DBMS_PIPE dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference pour plus d'informations sur la fonctionnalité DBMS_PIPE de base fournie dans Oracle Database.

Présentation de DBMS_PIPE pour les tubes simples

La fonctionnalité Pipe a plusieurs applications potentielles : interface de service externe, débogage, transactions indépendantes et alertes.

Sur la base de données Autonomous AI, le package DBMS_PIPE dispose de fonctionnalités étendues pour prendre en charge les canaux singleton. Pour plus d'informations, reportez-vous à DBMS_PIPE dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference.

Les fonctionnalités de pipeline singleton dans DBMS_PIPE fournissent les éléments suivants :

Un canal unique peut être l'un des types DBMS_PIPE pris en charge :

Récapitulatif des sous-programmes DBMS_PIPE pour les tubes singleton

Ce tableau répertorie les sous-programmes DBMS_PIPE et les décrit brièvement.

Sous-programme Description
Fonction CREATE_PIPE Crée un tuyau (nécessaire pour les tuyaux privés)

Fonction NEXT_ITEM_TYPE

Renvoie le type de données de l'élément suivant dans le tampon

Procédures PACK_MESSAGE

Crée un message dans la mémoire tampon locale

Procédure PURGE

Purge le contenu du tuyau nommé
Fonction RECEIVE_MESSAGE Copie le message du canal nommé dans le tampon local

Procédure RESET_BUFFER

Purge le contenu du tampon local

Fonction REMOVE_PIPE

Supprime le tuyau nommé
Fonction SEND_MESSAGE Envoie un message sur le canal nommé : crée implicitement un canal public si le canal nommé n'existe pas

Fonction UNIQUE_SESSION_NAME

Renvoie un nom de session unique

Procédures UNPACK_MESSAGE

Accède à l'élément suivant dans le tampon

Fonction CREATE_PIPE

Cette fonction crée explicitement un canal public ou privé. Si l'indicateur private est TRUE, le créateur de canal est affecté en tant que propriétaire du canal privé.

Les canaux créés explicitement ne peuvent être supprimés qu'en appelant REMOVE_PIPE ou en arrêtant l'instance.

Pour créer un singleton pipe, définissez le paramètre singleton sur TRUE. Les arguments suivants sont applicables aux tubes singleton :

Syntaxe

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;

Paramètres

Paramètre Description
pipename

Nom du pipeline que vous créez.

Vous devez utiliser ce nom lorsque vous appelez SEND_MESSAGE et RECEIVE_MESSAGE. Ce nom doit être unique dans l'instance.

Attention : n'utilisez pas de noms de canal commençant par ORA$. Elles sont réservées à l'utilisation par les procédures fournies par Oracle. Le nom de pipeline ne doit pas dépasser 128 octets et ne tient pas compte de la casse. Pour le moment, le nom ne peut pas contenir de caractères de prise en charge de la globalisation.

maxpipesize

Taille maximale autorisée pour le pipeline, en octets.

La taille totale de tous les messages sur le pipeline ne peut pas dépasser ce montant. Le message est bloqué s'il dépasse ce maximum.

La valeur par défaut de maxpipesize est de 66536 octets.

La valeur maxpipesize d'un tuyau devient une partie des caractéristiques du tuyau et persiste pendant toute sa durée de vie. Les appelants de SEND_MESSAGE avec des valeurs plus élevées augmentent la valeur de maxpipesize. Les appelants dont la valeur est inférieure utilisent la valeur supérieure existante.

La valeur par défaut maxpipesize (65536) est applicable à tous les tubes.

private

Utilise la valeur par défaut, TRUE, pour créer un canal privé.

Les canaux publics peuvent être implicitement créés lorsque vous appelez SEND_MESSAGE.

singleton

Utilisez TRUE pour créer un singleton pipe.

La valeur par défaut est FALSE

shelflife

Délai d'expiration en secondes d'un message mis en cache dans Singleton Pipe. Une fois l'heure shelflife indiquée dépassée, le message n'est plus accessible à partir du canal. Le paramètre shelflife ne s'applique qu'à un simple tube.

La valeur par défaut est 0, ce qui signifie que le message n'expire jamais.

Valeurs retournées

Retour Description
0

Succès.

Si le canal existe déjà et que l'utilisateur qui tente de le créer est autorisé à l'utiliser, Oracle renvoie 0, ce qui indique qu'il a réussi et toutes les données déjà présentes dans le canal restent.

6

Echec de la conversion du pipeline existant en pipeline singleton.

  • Un pipe implicite avec plusieurs messages existants ne peut pas être converti en pipe singleton.
  • Pour un canal explicite qui n'est pas Singleton, DBMS_PIPE.SEND_MESSAGE ne peut pas envoyer de message avec un argument singleton défini sur TRUE.
7 Une valeur différente de zéro est indiquée pour le paramètre shelflife et le tube n'est pas un tube singleton.
ORA-23322

Echec en raison d'un conflit de noms.

Si un canal portant le même nom existe et a été créé par un autre utilisateur, Oracle signale l'erreur ORA-23322, indiquant le conflit de dénomination.

Exceptions

Exception Description
Null pipe name Erreur d'autorisation : un canal portant le même nom existe déjà et vous n'êtes pas autorisé à l'utiliser.

Exemple

Créez un tuyau singleton avec un abri de 1 heure.

DECLARE
  l_status INTEGER;
BEGIN
  l_status := DBMS_PIPE.create_pipe(pipename  => 'MY_PIPE1',
                                    private   => TRUE,
                                    singleton => TRUE,
                                    shelflife => 3600);
END;
/

Fonction RECEIVE_MESSAGE

Cette fonction copie le message dans le tampon de messages local.

Syntaxe

DBMS_PIPE.RECEIVE_MESSAGE (
   pipename      IN VARCHAR2,
   timeout       IN INTEGER      DEFAULT maxwait,
   cache_func    IN VARCHAR2     DEFAULT NULL)
RETURN INTEGER;

Paramètres

Table - Paramètres de la fonction RECEIVE_MESSAGE

Paramètre Description
pipename

Nom du canal sur lequel vous souhaitez recevoir un message.

Les noms commençant par ORA$ sont réservés à Oracle.

timeout

Temps d'attente d'un message, en secondes. Un délai d'attente de 0 vous permet de lire sans bloquer.

Le délai d'expiration n'inclut pas le temps passé dans la fonction de cache d'exécution indiquée dans le paramètre cache_func.

Valeur par défaut : constante MAXWAIT, définie comme 86400000 (1000 jours).

cache_func

Cachez le nom de la fonction pour mettre automatiquement en cache un message dans un canal unique.

Le nom de la fonction doit être entièrement qualifié avec le schéma propriétaire :

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

La valeur par défaut est NULL

Valeurs retournées

Table - Valeurs renvoyées par la fonction RECEIVE_MESSAGE

Retour Description
0 Succès
1 Délai expiré. Si le tuyau a été implicitement créé et est vide, il est enlevé.
2 L'enregistrement dans le tuyau est trop volumineux pour le tampon.
3 Une interruption s'est produite.
8 La fonction de cache ne peut être spécifiée que lorsque vous utilisez un canal unique.
ORA-23322 L'utilisateur ne dispose pas de privilèges suffisants pour lire à partir du canal.

Remarques sur l'utilisation

Paramètre de fonction de cache

Singleton Pipes prend en charge la fonction de cache pour mettre automatiquement en cache un message dans le canal dans le cas des deux scénarios suivants :

Le nom de la fonction doit être entièrement qualifié avec le schéma propriétaire :

Pour utiliser une fonction de cache, l'utilisateur de session en cours qui appelle DBMS_PIPE.RECEIVE_MESSAGE doit disposer des privilèges requis pour exécuter la fonction de cache.

Syntaxe de la fonction de cache

CREATE OR REPLACE FUNCTION *cache_function_name* (
       pipename  IN VARCHAR2
) RETURN INTEGER;
Paramètre Type de données Description
pipename VARCHAR2 Nom de la canalisation unique.
Retour Description
0 Succès
Non nul Valeur d'échec renvoyée parDBMS_PIPE.RECEIVE_MESSAGE

Définissez une fonction de cache pour fournir l'encapsulation et l'abstraction de la complexité des sessions de lecture de Singleton Pipe. Les opérations standard d'une fonction de cache sont les suivantes :

Exceptions

Exception Description
Null pipe name Erreur d'autorisation. Privilège insuffisant pour supprimer l'enregistrement du canal. Le tuyau appartient à quelqu'un d'autre.

Exemple

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

Fonction SEND_MESSAGE

Cette fonction envoie un message sur le pipeline nommé.

Le message est contenu dans le tampon de message local, qui a été rempli d'appels à PACK_MESSAGE. Vous pouvez créer un canal explicitement à l'aide de CREATE_PIPE. Sinon, il est créé implicitement.

Pour créer un canal unique implicite, définissez le paramètre singleton sur TRUE. Les arguments suivants sont applicables aux tubes singleton :

Fonction CREATE_PIPE et sera la valeur par défaut pour tous les nouveaux messages mis en cache dans le canal unique.

Syntaxe

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;

Paramètres

Table - Paramètres de la fonction SEND_MESSAGE

Paramètre Description
pipename

Nom du canal sur lequel vous voulez placer le message.

Si vous utilisez un canal explicite, il s'agit du nom que vous avez indiqué lorsque vous avez appelé CREATE_PIPE.

**Attention :** N'utilisez pas de noms de pipe commençant par 'ORA$'. Ces noms sont réservés à l'usage des procédures fournies par Oracle. Le nom de pipeline ne doit pas dépasser 128 octets et ne respecte pas la casse. Pour le moment, le nom ne peut pas contenir de caractères de prise en charge de la globalisation.

timeout

Temps d'attente lors de la tentative de placement d'un message sur un canal, en secondes.

La valeur par défaut est la constante MAXWAIT, qui est définie comme 86400000 (1000 jours).

maxpipesize

Taille maximale autorisée pour le pipeline, en octets.

La taille totale de tous les messages sur le pipeline ne peut pas dépasser ce montant. Le message est bloqué s'il dépasse ce maximum. La longueur par défaut est de 65536 octets.

La valeur maxpipesize d'un tuyau devient une partie des caractéristiques du tuyau et persiste pendant toute sa durée de vie. Les appelants de SEND_MESSAGE avec des valeurs plus élevées augmentent la valeur de maxpipesize. Les appelants dont la valeur est inférieure utilisent simplement la valeur supérieure existante.

Si vous indiquez maxpipesize dans le cadre de la procédure SEND_MESSAGE, vous n'avez plus besoin d'un appel distinct pour ouvrir le canal. Si vous avez créé le canal de manière explicite, vous pouvez utiliser le paramètre facultatif maxpipesize pour remplacer les spécifications de taille de canal de création.

La valeur par défaut maxpipesize (65536) est applicable à tous les tubes.

singleton

Utilisez TRUE pour créer un singleton pipe.

La valeur par défaut est FALSE

shelflife

Délai d'expiration en secondes d'un message mis en cache dans Singleton Pipe.

Une fois l'heure shelflife indiquée dépassée, le message n'est plus accessible à partir du canal. Le paramètre shelflife ne s'applique qu'à un simple tube.

La valeur par défaut est 0, ce qui signifie que le message n'expire jamais.

Valeurs retournées

Retour Description
0

Succès.

Si le canal existe déjà et que l'utilisateur qui tente de le créer est autorisé à l'utiliser, Oracle renvoie 0, ce qui indique qu'il a réussi et toutes les données déjà présentes dans le canal restent.

Si un utilisateur connecté en tant que SYSDBS/SYSOPER recrée un canal, Oracle renvoie le statut 0, mais la propriété du canal reste inchangée.

1

Délai expiré.

Cette procédure peut expirer soit parce qu'elle ne peut pas obtenir un verrou sur le tuyau, soit parce que le tuyau reste trop plein pour être utilisé. Si le tuyau a été implicitement créé et est vide, il est enlevé.

3

Une interruption s'est produite.

Si le tuyau a été implicitement créé et est vide, il est enlevé.

6

Echec de la conversion du pipeline existant en pipeline singleton.

  • Un pipe implicite avec plusieurs messages existants ne peut pas être converti en pipe singleton.
  • Pour un canal explicite qui n'est pas Singleton, DBMS_PIPE.SEND_MESSAGE ne peut pas envoyer de message avec un argument singleton défini sur TRUE.
7 Une valeur différente de zéro est indiquée pour le paramètre shelflife et le tube n'est pas un tube singleton.
ORA-23322

Les privilèges sont insuffisants.

Si un canal portant le même nom existe et a été créé par un autre utilisateur, Oracle signale l'erreur ORA-23322, indiquant le conflit de dénomination.

Exceptions

Exception Description
Null pipe name Erreur d'autorisation. Privilège insuffisant pour écrire dans le pipe. Le tuyau est privé et appartient à quelqu'un d'autre.

Contenu connexe

Mise en cache des messages avec des canaux uniques