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 :
-
Possibilité de mettre en cache et d'extraire un message personnalisé de 32 767 octets maximum dans la mémoire de base de données Oracle. La taille de message maximale de 32 767 octets est applicable à tous les tubes, y compris les tubes simples. Les versions précédentes de
DBMS_PIPEavaient une taille de message maximale plus petite. -
Partagez le message mis en cache entre plusieurs sessions de base de données avec des lectures simultanées.
-
Méthodes d'invalidation du cache :
-
Invalidation de cache explicite contrôlée par l'utilisateur.
-
Invalidation du cache après l'intervalle de temps (en secondes) d'un paramètre spécifié par l'utilisateur (
shelflife).
-
-
API PL/SQL déclaratives et faciles à utiliser pour la mise en cache.
-
Prend en charge les bases de données en lecture seule et en lecture-écriture.
Un canal unique peut être l'un des types DBMS_PIPE pris en charge :
-
Tuyau implicite : créé automatiquement lorsqu'un message est envoyé avec un nom de tuyau inconnu à l'aide de la fonction
DBMS_PIPE.SEND_MESSAGE. -
Tuyau explicite : créé à l'aide de la fonction
DBMS_PIPE.CREATE_PIPEavec un nom de tuyau spécifié par l'utilisateur. -
Tuyau public : accessible par tout utilisateur disposant du droit d'accès
EXECUTEsur le packageDBMS_PIPE -
Tuyau privé : accessible par les sessions avec le même utilisateur que le créateur de pipe.
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 :
-
singleton: indique que le canal doit être créé en tant que canal unique (valeur par défaut :FALSE). -
shelflife: indiquez éventuellement l'expiration du délai d'attente (en secondes) du message mis en cache dans le canal unique. Il peut être utilisé pour l'invalidation implicite d'un message dans Singleton Pipe.Le message
shelflifedans Singleton Pipe peut également être spécifié lorsque vous envoyez un message (reportez-vous à Fonction SEND_MESSAGE).
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 Attention : n'utilisez pas de noms de canal commençant par |
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 La valeur La valeur par défaut |
private |
Utilise la valeur par défaut, Les canaux publics peuvent être implicitement créés lorsque vous appelez |
singleton |
Utilisez La valeur par défaut est |
shelflife |
Délai d'expiration en secondes d'un message mis en cache dans Singleton Pipe. Une fois l'heure La valeur par défaut est |
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.
|
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 |
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 |
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 Valeur par défaut : constante |
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 :
La valeur par défaut est |
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
-
Pour recevoir un message d'un canal, appelez d'abord
RECEIVE_MESSAGE. Lorsque vous recevez un message, il est retiré du canal ; par conséquent, un message ne peut être reçu qu'une seule fois. Pour les tuyaux créés implicitement, le tuyau est supprimé une fois que le dernier enregistrement a été supprimé du tuyau. -
Si le canal que vous indiquez lorsque vous appelez
RECEIVE_MESSAGEn'existe pas déjà, Oracle crée implicitement le canal et attend de recevoir le message. Si le message n'arrive pas dans un délai d'attente défini, l'appel revient et le canal est supprimé. -
Une fois le message reçu, vous devez passer un ou plusieurs appels à
UNPACK_MESSAGEpour accéder aux éléments individuels du message. La procédureUNPACK_MESSAGEest surchargée pour décompresser les éléments de typeDATE,NUMBER,VARCHAR2. Il existe deux procédures supplémentaires pour décompresser les élémentsRAWetROWID. Si vous ne connaissez pas le type de données que vous tentez de décompresser, appelezNEXT_ITEM_TYPEpour déterminer le type de l'élément suivant dans le tampon.
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 :
-
Singleton Pipe est vide.
-
Le message dans le canal unique n'est pas valide en raison d'un délai de
shelflife.
Le nom de la fonction doit être entièrement qualifié avec le schéma propriétaire :
-
OWNER.FUNCTION_NAME -
OWNER.PACKAGE.FUNCTION_NAME
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 :
-
Créez un canal unique, pour un canal explicite, à l'aide de
DBMS_PIPE.CREATE_PIPE. -
Créez le message à mettre en cache dans le singleton pipe.
-
Envoyez un message à Singleton Pipe, en spécifiant éventuellement un
shelflifepour le message implicite.
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 :
-
singleton: indique que le canal doit être créé en tant que canal unique (valeur par défaut :FALSE). -
shelflife: indiquez éventuellement l'expiration de la durée de conservation du message mis en cache dans le singleton pipe. Il peut être utilisé pour l'invalidation implicite d'un message dans Singleton Pipe.Cet argument est applicable aux tubes Singleton implicites et explicites. Une valeur
shelflifespécifiée dans Fonction SEND_MESSAGE remplace la valeurshelflifespécifiée pour le canal unique explicite dans
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é **Attention :** N'utilisez pas de noms de pipe commençant par ' |
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 |
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 Si vous indiquez La valeur par défaut |
singleton |
Utilisez La valeur par défaut est |
shelflife |
Délai d'expiration en secondes d'un message mis en cache dans Singleton Pipe. Une fois l'heure La valeur par défaut est |
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 |
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.
|
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 |
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. |