DBMS_PIPE-Package (Singleton Pipes)

Mit dem Package DBMS_PIPE können zwei oder mehr Sessions in derselben Instanz kommunizieren.

Oracle Autonomous AI Database on Dedicated Exadata Infrastructure unterstützt die DBMS_PIPE-Kernfunktionalität wie in Oracle Database 19c verfügbar sowie Erweiterungen.

Weitere Informationen zur Oracle Database-Core-Funktionalität DBMS_PIPE finden Sie unter DBMS_PIPE in Oracle Database 19c PL/SQL-Packages und Typenreferenz oder Oracle Database 26ai PL/SQL-Packages und Typenreferenz.

DBMS_PIPE - Übersicht für Singleton Pipes

Pipe-Funktionalität hat mehrere potenzielle Anwendungen: externe Serviceschnittstelle, Debugging, unabhängige Transaktionen und Warnungen.

In einer autonomen AI-Datenbank verfügt das Package DBMS_PIPE über erweiterte Funktionen zur Unterstützung von Singleton-Pipes. Weitere Informationen finden Sie unter DBMS_PIPE in Oracle Database 19c PL/SQL-Packages and Types Reference oder Oracle Database 26ai PL/SQL Packages and Types Reference.

Die Singleton Pipe-Funktionen in DBMS_PIPE bieten Folgendes:

Eine Singleton-Pipe kann einer der unterstützten DBMS_PIPE-Typen sein:

Übersicht über DBMS_PIPE-Unterprogramme für Singleton-Pipes

In dieser Tabelle werden die Unterprogramme DBMS_PIPE aufgeführt und kurz beschrieben.

Unterprogramm Beschreibung
CREATE_PIPE-Funktion Erstellt eine Pipe (für private Pipes erforderlich)

NEXT_ITEM_TYPE (Funktion)

Gibt den Datentyp des nächsten Elements im Puffer zurück

PACK_MESSAGE-Verfahren

Build-Nachricht im lokalen Puffer

LÖSCHEN

Löscht den Inhalt der benannten Pipe
RECEIVE_MESSAGE-Funktion Kopiert Nachricht aus benannter Pipe in lokalen Puffer

Prozedur RESET_BUFFER

Löscht den Inhalt des lokalen Puffers

REMOVE_PIPE-Funktion

Entfernt die benannte Pipe
SEND_MESSAGE-Funktion Sendet Nachricht an benannte Pipe: Dadurch wird implizit eine öffentliche Pipe erstellt, wenn die benannte Pipe nicht vorhanden ist

UNIQUE_SESSION_NAME-Funktion

Gibt einen eindeutigen Sessionnamen zurück

UNPACK_MESSAGE-Verfahren

Greift auf das nächste Element im Puffer zu

CREATE_PIPE-Funktion

Diese Funktion erstellt explizit eine öffentliche oder private Pipe. Wenn das Flag private TRUE ist, wird der Pipe-Ersteller als Eigentümer der privaten Pipe zugewiesen.

Explizit erstellte Pipes können nur entfernt werden, indem REMOVE_PIPE aufgerufen oder die Instanz heruntergefahren wird.

Um eine Singleton-Pipe zu erstellen, setzen Sie den Parameter singleton auf TRUE. Die folgenden Argumente gelten für Singleton Pipes:

Syntax

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;

Parameter

Parameter Beschreibung
pipename

Name der Pipe, die Sie erstellen.

Sie müssen diesen Namen verwenden, wenn Sie SEND_MESSAGE und RECEIVE_MESSAGE aufrufen. Dieser Name muss instanzübergreifend eindeutig sein.

Achtung: Verwenden Sie keine Pipe-Namen, die mit ORA$ beginnen. Diese sind für die von Oracle bereitgestellten Verfahren reserviert. Pipename darf nicht länger als 128 Byte sein und die Groß-/Kleinschreibung wird nicht beachtet. Derzeit darf der Name keine Zeichen für die Globalisierungsunterstützung enthalten.

maxpipesize

Die maximal zulässige Größe für die Pipe in Byte.

Die Gesamtgröße aller Nachrichten in der Pipe darf diesen Betrag nicht überschreiten. Die Nachricht wird blockiert, wenn sie dieses Maximum überschreitet.

Der Standardwert für maxpipesize ist 66536 Byte.

Die maxpipesize für ein Rohr wird Teil der Eigenschaften des Rohres und bleibt für die Lebensdauer des Rohres bestehen. Aufrufer von SEND_MESSAGE mit größeren Werten führen dazu, dass maxpipesize erhöht wird. Anrufer mit einem kleineren Wert verwenden den vorhandenen, größeren Wert.

Der Standardwert maxpipesize von 65536 gilt für alle Pipes.

private

Verwendet den Standardwert TRUE, um eine private Pipe zu erstellen.

Öffentliche Pipes können implizit erstellt werden, wenn Sie SEND_MESSAGE aufrufen.

singleton

Verwenden Sie TRUE, um eine Singleton Pipe zu erstellen.

Standardwert: FALSE

shelflife

Ablaufzeit in Sekunden einer in Singleton Pipe gecachten Nachricht. Nachdem die angegebene shelflife-Zeit überschritten wurde, ist die Nachricht nicht mehr über die Pipe zugänglich. Der Parameter shelflife gilt nur für eine Singleton-Pipe.

Der Standardwert ist 0. Dies bedeutet, dass die Nachricht nie abläuft.

Rückgabewerte

Return Beschreibung
0

Erfolgreich.

Wenn die Pipe bereits vorhanden ist und der Benutzer, der versucht, sie zu erstellen, zur Verwendung autorisiert ist, gibt Oracle 0 zurück, was den Erfolg anzeigt, und alle Daten, die sich bereits in der Pipe befinden, bleiben erhalten.

6

Vorhandene Pipe konnte nicht in Singleton-Pipe konvertiert werden.

  • Implizite Pipe mit mehreren vorhandenen Nachrichten kann nicht in eine Singleton Pipe konvertiert werden.
  • Bei einer expliziten Pipe, die nicht Singleton ist, kann DBMS_PIPE.SEND_MESSAGE keine Nachricht senden, deren Singleton-Argument auf TRUE gesetzt ist.
7 Für den Parameter shelflife wird ein Wert ungleich Null angegeben, und die Pipe ist keine Singleton-Pipe.
ORA-23322

Fehler aufgrund eines Namenskonflikts.

Wenn eine Pipe mit demselben Namen vorhanden ist und von einem anderen Benutzer erstellt wurde, gibt Oracle den Fehler ORA-23322 an, der auf den Namenskonflikt hinweist.

Exceptions

Ausnahme Beschreibung
Null pipe name Berechtigungsfehler: Pipe mit demselben Namen ist bereits vorhanden, und Sie dürfen ihn nicht verwenden.

Beispiel

Erstellen Sie eine Singleton Pipe mit einer Haltbarkeit von 1 Stunde.

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

RECEIVE_MESSAGE-Funktion

Diese Funktion kopiert die Nachricht in den lokalen Nachrichtenpuffer.

Syntax

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

Parameter

Tabelle - RECEIVE_MESSAGE-Funktionsparameter

Parameter Beschreibung
pipename

Name der Pipe, auf der eine Nachricht empfangen werden soll.

Namen, die mit ORA$ beginnen, sind für die Verwendung durch Oracle reserviert.

timeout

Wartezeit für eine Nachricht in Sekunden. Mit einem Timeout von 0 können Sie lesen, ohne zu blockieren.

Der Timeout enthält nicht die Zeit, die in der Ausführungscachefunktion verbracht wurde, die im Parameter cache_func angegeben ist.

Standardwert: Die Konstante MAXWAIT, die als 86400000 (1000 Tage) definiert ist.

cache_func

Cachen Sie den Funktionsnamen, um eine Nachricht automatisch in einer Singleton Pipe zu cachen.

Der Name der Funktion muss mit dem Eigentümerschema vollqualifiziert sein:

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

Standardwert: NULL

Rückgabewerte

Tabelle - Rückgabewerte der Funktion RECEIVE_MESSAGE

Return Beschreibung
0 Erfolgreich
1 Wegen Timeout abgebrochen. Wenn die Pipe implizit erstellt wurde und leer ist, wird sie entfernt.
2 Datensatz in der Pipe ist zu groß für den Puffer.
3 Eine Unterbrechung ist aufgetreten.
8 Cachefunktion kann nur bei Verwendung einer Singleton Pipe angegeben werden.
ORA-23322 Der Benutzer hat keine ausreichenden Berechtigungen zum Lesen aus der Pipe.

Verwendungshinweise

Cachefunktionsparameter

Singleton Pipes unterstützt die Cache-Funktion, um eine Nachricht automatisch in der Pipe zu cachen, falls die folgenden beiden Szenarios auftreten:

Der Name der Funktion muss mit dem Eigentümerschema vollqualifiziert sein:

Um eine Cachefunktion verwenden zu können, muss der aktuelle Sessionbenutzer, der DBMS_PIPE.RECEIVE_MESSAGE aufruft, über die erforderlichen Berechtigungen zum Ausführen der Cachefunktion verfügen.

Cachefunktionssyntax

CREATE OR REPLACE FUNCTION *cache_function_name* (
       pipename  IN VARCHAR2
) RETURN INTEGER;
Parameter Datentyp Beschreibung
pipename VARCHAR2 Name der Singleton Pipe.
Return Beschreibung
0 Erfolgreich
Nicht null Fehlerwert vonDBMS_PIPE.RECEIVE_MESSAGE zurückgegeben

Definieren Sie eine Cache-Funktion, um eine Kapselung und Abstraktion der Komplexität aus den Lesersessions von Singleton Pipe bereitzustellen. Typische Vorgänge innerhalb einer Cache-Funktion sind:

Exceptions

Ausnahme Beschreibung
Null pipe name Berechtigungsfehler. Unzureichende Berechtigung zum Entfernen des Datensatzes aus der Pipe. Die Pipe gehört einer anderen Person.

Beispiel

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

SEND_MESSAGE-Funktion

Diese Funktion sendet eine Nachricht an die benannte Pipe.

Die Nachricht ist im lokalen Nachrichtenpuffer enthalten, der mit Aufrufen an PACK_MESSAGE gefüllt wurde. Sie können eine Pipe explizit mit CREATE_PIPE erstellen. Andernfalls wird sie implizit erstellt.

Um eine implizite Singleton-Pipe zu erstellen, setzen Sie den Parameter singleton auf TRUE. Die folgenden Argumente gelten für Singleton Pipes:

CREATE_PIPE-Funktion und ist der Standardwert für alle neuen Nachrichten, die in der Singleton-Pipe gecacht werden.

Syntax

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;

Parameter

Tabelle - Parameter der Funktion SEND_MESSAGE

Parameter Beschreibung
pipename

Name der Pipe, auf der die Nachricht abgelegt werden soll.

Wenn Sie eine explizite Pipe verwenden, ist dies der Name, den Sie beim Aufruf von CREATE_PIPE angegeben haben.

**Achtung:** Verwenden Sie keine Pipe-Namen, die mit "ORA$" beginnen. Diese Namen sind für die Verwendung durch von Oracle bereitgestellte Prozeduren reserviert. Pipename darf nicht länger als 128 Byte sein und die Groß-/Kleinschreibung wird nicht beachtet. Derzeit darf der Name keine Zeichen für die Globalisierungsunterstützung enthalten.

timeout

Wartezeit beim Versuch, eine Nachricht in einer Pipe zu platzieren, in Sekunden.

Der Standardwert ist die Konstante MAXWAIT, die als 86400000 (1000 Tage) definiert ist.

maxpipesize

Maximal zulässige Größe für die Pipe in Byte.

Die Gesamtgröße aller Nachrichten in der Pipe darf diesen Betrag nicht überschreiten. Die Nachricht wird blockiert, wenn sie dieses Maximum überschreitet. Der Standardwert beträgt 65536 Byte.

Die maxpipesize für ein Rohr wird Teil der Eigenschaften des Rohres und bleibt für die Lebensdauer des Rohres bestehen. Aufrufer von SEND_MESSAGE mit größeren Werten führen dazu, dass maxpipesize erhöht wird. Anrufer mit einem kleineren Wert verwenden einfach den vorhandenen, größeren Wert.

Wenn Sie maxpipesize als Teil der Prozedur SEND_MESSAGE angeben, ist kein separater Aufruf zum Öffnen der Pipe erforderlich. Wenn Sie die Pipe explizit erstellt haben, können Sie den optionalen Parameter maxpipesize verwenden, um die Spezifikationen für die Erstellungs-Pipe-Größe außer Kraft zu setzen.

Der Standardwert maxpipesize von 65536 gilt für alle Pipes.

singleton

Verwenden Sie TRUE, um eine Singleton Pipe zu erstellen.

Standardwert: FALSE

shelflife

Ablaufzeit in Sekunden einer in Singleton Pipe gecachten Nachricht.

Nachdem die angegebene shelflife-Zeit überschritten wurde, ist die Nachricht nicht mehr über die Pipe zugänglich. Der Parameter shelflife gilt nur für eine Singleton-Pipe.

Der Standardwert ist 0. Dies bedeutet, dass die Nachricht nie abläuft.

Rückgabewerte

Return Beschreibung
0

Erfolgreich.

Wenn die Pipe bereits vorhanden ist und der Benutzer, der sie zu erstellen versucht, zur Verwendung autorisiert ist, gibt Oracle 0 zurück, was den Erfolg anzeigt, und alle Daten, die sich bereits in der Pipe befinden, bleiben erhalten.

Wenn ein als SYSDBS/SYSOPER verbundener Benutzer eine Pipe neu erstellt, gibt Oracle den Status 0 zurück, der Eigentümer der Pipe bleibt jedoch unverändert.

1

Wegen Timeout abgebrochen.

Bei diesem Verfahren kann ein Timeout auftreten, weil es keine Sperre für das Rohr erhalten kann oder weil das Rohr zu voll ist, um verwendet zu werden. Wenn die Pipe implizit erstellt wurde und leer ist, wird sie entfernt.

3

Eine Unterbrechung ist aufgetreten.

Wenn die Pipe implizit erstellt wurde und leer ist, wird sie entfernt.

6

Vorhandene Pipe konnte nicht in Singleton-Pipe konvertiert werden.

  • Implizite Pipe mit mehreren vorhandenen Nachrichten kann nicht in eine Singleton Pipe konvertiert werden.
  • Bei einer expliziten Pipe, die nicht Singleton ist, kann DBMS_PIPE.SEND_MESSAGE keine Nachricht senden, deren Singleton-Argument auf TRUE gesetzt ist.
7 Für den Parameter shelflife wird ein Wert ungleich Null angegeben, und die Pipe ist keine Singleton-Pipe.
ORA-23322

Unzureichende Berechtigungen.

Wenn eine Pipe mit demselben Namen vorhanden ist und von einem anderen Benutzer erstellt wurde, gibt Oracle den Fehler ORA-23322 an, der auf den Namenskonflikt hinweist.

Exceptions

Ausnahme Beschreibung
Null pipe name Berechtigungsfehler. Unzureichende Berechtigung zum Schreiben in die Pipe. Die Pfeife ist privat und gehört jemand anderem.

Verwandte Inhalte

Nachrichten mit Singleton-Pipes cachen