DBMS_PIPE-Package

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

Oracle Autonomous Database unterstützt die in Oracle Database 19c verfügbare DBMS_PIPE-Kernfunktionalität sowie Erweiterungen.

Weitere Informationen zur Kernfunktion von DBMS_PIPE in Oracle Database finden Sie unter DBMS_PIPE.

DBMS_PIPE Überblick über Singleton Pipes

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

In Autonomous Database verfügt das Package DBMS_PIPE über erweiterte Funktionen zur Unterstützung von Singleton-Pipes.

Singleton-Pipe-Funktionen in DBMS_PIPE bieten Folgendes:

  • Möglichkeit, eine benutzerdefinierte Nachricht mit bis zu 32.767 Byte im Oracle-Datenbankspeicher zu cachen und abzurufen. Die Nachrichtengröße von maximal 32.767 Byte gilt für alle Pipes, einschließlich Singleton Pipes. Frühere Versionen von DBMS_PIPE hatten eine kleinere maximale Nachrichtengröße.

  • Teilen Sie die gecachte Nachricht über mehrere Datenbanksessions hinweg mit gleichzeitigen Lesevorgängen.

  • Methoden für die Cache-Invalidierung:

    • Explizite Cacheinvalidierung durch Benutzer gesteuert.
    • Cacheinvalidierung nach einem vom Benutzer angegebenen Parameter (shelflife) Zeitintervall (in Sekunden).
  • Deklarative und benutzerfreundliche PL/SQL-APIs für das Caching.

  • Unterstützt sowohl schreibgeschützte als auch schreibgeschützte Datenbanken.

Bei einer Singleton-Pipe kann es sich um einen der unterstützten DBMS_PIPE-Typen handeln:

  • Implizite Pipe: Wird automatisch erstellt, wenn eine Nachricht mit einem unbekannten Pipe-Namen mit der Funktion DBMS_PIPE.SEND_MESSAGE gesendet wird.
  • Explizite Pipe: Wird mit der Funktion DBMS_PIPE.CREATE_PIPE mit einem vom Benutzer angegebenen Pipe-Namen erstellt.
  • Public Pipe: Jeder Benutzer mit der Berechtigung EXECUTE für das Package DBMS_PIPE kann darauf zugreifen
  • Private Pipe: Zugriff durch Sessions mit demselben Benutzer wie der Pipe-Ersteller möglich.

Zusammenfassung der DBMS_PIPE-Unterprogramme für Singleton Pipes

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

Tabelle 6-1: Unterprogramme des Packages DBMS_PIPE

Unterprogramm Beschreibung

Funktion CREATE_PIPE

Erstellt ein Rohr (für private Rohre erforderlich)

Funktion NEXT_ITEM_TYPE

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

PACK_MESSAGE-Prozeduren

Erstellt Meldung in lokalem Puffer

Prozedur LÖSCHEN

Löscht den Inhalt der benannten Pipe

Funktion RECEIVE_MESSAGE

Kopiert Nachricht aus benannter Pipe in lokalen Puffer

Prozedur RESET_BUFFER

Löscht den Inhalt des lokalen Puffers

Funktion REMOVE_PIPE

Entfernt die benannte Pipe

Funktion SEND_MESSAGE

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

Funktion UNIQUE_SESSION_NAME

Gibt einen eindeutigen Sessionnamen zurück

UNPACK_MESSAGE-Prozeduren

Greift auf nächstes Element im Puffer zu

Funktion CREATE_PIPE

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

Explizit erstellte Pipes können nur entfernt werden, indem Sie REMOVE_PIPE aufrufen oder die Instanz herunterfahren.

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

  • singleton: Gibt an, dass die Pipe als Singleton Pipe erstellt werden soll (Standardwert: FALSE).

  • shelflife: Geben Sie optional einen Shelflife-Ablauf (in Sekunden) der gecachten Nachricht in der Singleton-Pipe an. Sie kann zur impliziten Invalidierung von Nachrichten in Singleton Pipe verwendet werden.

    Die Meldung shelflife in der Singleton-Pipe kann auch angegeben werden, wenn Sie eine Nachrichtennachricht senden (siehe Funktion SEND_MESSAGE).

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

Tabelle 6-2: CREATE_PIPE-Funktionsparameter

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 in der ganzen Instanz eindeutig sein.

Achtung: Verwenden Sie keine Pipe-Namen, die mit ORA$ beginnen. Diese sind für die Verwendung durch von Oracle bereitgestellte Prozeduren reserviert. Pipename darf nicht länger als 128 Byte sein. Groß-/Kleinschreibung wird nicht beachtet. Derzeit darf der Name keine Globalization Support-Zeichen 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 diesen Höchstwert überschreitet.

Die Standard-maxpipesize beträgt 66536 Byte.

Die maxpipesize für eine Rohrleitung wird zu einem Teil der Eigenschaften der Rohrleitung und bleibt für die Lebensdauer der Rohrleitung 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, kann die Nachricht nicht mehr über die Pipe aufgerufen werden. Der Parameter shelflife gilt nur für eine Singleton-Pipe.

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

Werte zurückgeben

Tabelle 6-3: Rückgabewerte der Funktion CREATE_PIPE

Zurückgehen 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 auf Erfolg hinweist, 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 mehr als einer vorhandenen Nachricht kann nicht in eine Singleton Pipe konvertiert werden.
  • Bei einer expliziten Pipe, die kein Singleton ist, kann DBMS_PIPE.SEND_MESSAGE keine Nachricht senden, bei der das 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 den Benennungskonflikt anzeigt.

Ausnahmen

Tabelle 6-4: CREATE_PIPE Funktionsausnahme

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler: Pipe mit demselben Namen ist bereits vorhanden, und Sie dürfen sie nicht verwenden.

Beispiel

Erstellen Sie eine Singleton Pipe mit einem Shelflife von 1 Stunde.

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

Funktion RECEIVE_MESSAGE

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 6-5: RECEIVE_MESSAGE-Funktionsparameter

Parameter Beschreibung

pipename

Name der Pipe, auf der Sie eine Nachricht empfangen möchten.

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 ohne Blockierung lesen.

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 864000000 (1000 Tage) definiert ist.

cache_func

Cachefunktionsname zum automatischen Cachen einer Nachricht in einer Singleton-Pipe.

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

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

Standardwert: NULL

Werte zurückgeben

Tabelle 6-6: Rückgabewerte der Funktion RECEIVE_MESSAGE

Zurückgehen Beschreibung

0

Erfolgreich

1

Timeout. 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

Interrupt 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.

Hinweise zur Verwendung

Um eine Nachricht von einer Pipe zu empfangen, rufen Sie zuerst RECEIVE_MESSAGE auf. Wenn Sie eine Nachricht erhalten, wird sie aus der Pipe entfernt. Daher kann eine Nachricht nur einmal empfangen werden. Bei implizit erstellten Rohren wird das Rohr entfernt, nachdem der letzte Datensatz aus dem Rohr entfernt wurde.

Wenn die Pipe, die Sie beim Aufrufen von RECEIVE_MESSAGE angeben, noch nicht vorhanden ist, erstellt Oracle die Pipe implizit und wartet auf den Empfang der Nachricht. Wenn die Nachricht nicht innerhalb eines bestimmten Timeoutintervalls ankommt, wird der Aufruf zurückgegeben und die Pipe entfernt.

Nachdem Sie die Nachricht erhalten haben, müssen Sie mindestens einen Aufruf an UNPACK_MESSAGE ausführen, um auf die einzelnen Elemente in der Nachricht zuzugreifen. Die Prozedur UNPACK_MESSAGE ist überladen, um Elemente vom Typ DATE, NUMBER, VARCHAR2 zu entpacken. Es gibt zwei zusätzliche Prozeduren zum Entpacken von RAW- und ROWID-Elementen. Wenn Sie den Typ der Daten nicht kennen, die Sie entpacken möchten, rufen Sie NEXT_ITEM_TYPE auf, um den Typ des nächsten Elements im Puffer zu bestimmen.

Cachefunktionsparameter

Singleton Pipes unterstützen die Cachefunktion, um eine Nachricht in der Pipe automatisch im Falle der folgenden beiden Szenarios zu cachen:

  • Singleton Pipe ist leer.
  • Nachricht in Singleton-Pipe ist aufgrund der verstrichenen shelflife-Zeit ungültig.

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

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

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

Cache-Funktionssyntax

CREATE OR REPLACE FUNCTION cache_function_name (
       pipename  IN VARCHAR2
) RETURN INTEGER;
Parameter Datentyp Beschreibung

pipename

VARCHAR2

Name der Singleton-Pipe.

Zurückgehen Beschreibung
0 Erfolgreich
Nicht null Fehlerwert zurückgegeben von DBMS_PIPE.RECEIVE_MESSAGE

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

  • Erstellen Sie mit DBMS_PIPE.CREATE_PIPE eine Singleton Pipe für eine explizite Pipe.
  • Erstellen Sie die Nachricht, die in der Singleton-Pipe gecacht werden soll.
  • Nachricht an Singleton-Pipe senden, optional shelflife für die implizite Nachricht angeben.

Ausnahmen

Tabelle 6-7: RECEIVE_MESSAGE Funktionsausnahmen

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler. Unzureichende Berechtigung zum Entfernen des Datensatzes aus der Pipe. Die Pfeife gehört jemand anderem.

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;
/

Funktion SEND_MESSAGE

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:

  • singleton: Gibt an, dass die Pipe als Singleton Pipe erstellt werden soll (Standardwert: FALSE).
  • shelflife: Optional können Sie einen Shelflife-Ablauf der gecachten Nachricht in der Singleton-Pipe angeben. Sie kann zur impliziten Invalidierung von Nachrichten in Singleton Pipe verwendet werden.

    Dieses Argument gilt sowohl für implizite als auch explizite Singleton-Pipes. Ein in der Funktion SEND_MESSAGE angegebener shelflife-Wert überschreibt den für die explizite Singleton-Pipe in der Funktion CREATE_PIPE angegebenen shelflife-Wert 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 6-8: Funktionsparameter SEND_MESSAGE

Parameter Beschreibung

pipename

Name der Pipe, auf der Sie die Nachricht platzieren möchten.

Wenn Sie eine explizite Pipe verwenden, ist dies der Name, den Sie beim Aufrufen 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. Dabei wird die Groß-/Kleinschreibung nicht beachtet. Derzeit darf der Name keine Globalization Support-Zeichen 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 diesen Höchstwert überschreitet. Der Standardwert beträgt 65536 Byte.

Die maxpipesize für eine Rohrleitung wird zu einem Teil der Eigenschaften der Rohrleitung und bleibt für die Lebensdauer der Rohrleitung 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 Größe der Erstellungs-Pipe 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, kann die Nachricht nicht mehr über die Pipe aufgerufen werden. Der Parameter shelflife gilt nur für eine Singleton-Pipe.

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

Werte zurückgeben

Tabelle 6-9: Rückgabewerte der Funktion SEND_MESSAGE

Zurückgehen 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 auf Erfolg hinweist, und alle Daten, die sich bereits in der Pipe befinden, bleiben erhalten.

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

1

Timeout.

Bei dieser Prozedur kann eine Zeitüberschreitung auftreten, da die Pipe nicht gesperrt werden kann oder weil die Pipe zu voll für die Verwendung bleibt. Wenn die Pipe implizit erstellt wurde und leer ist, wird sie entfernt.

3

Interrupt 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 mehr als einer vorhandenen Nachricht kann nicht in eine Singleton Pipe konvertiert werden.
  • Bei einer expliziten Pipe, die kein Singleton ist, kann DBMS_PIPE.SEND_MESSAGE keine Nachricht senden, bei der das 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

Berechtigungen reichen nicht aus.

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

Ausnahmen

Tabelle 6-10: SEND_MESSAGE Funktionsausnahme

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler. Unzureichende Berechtigung zum Schreiben in die Pipe. Die Pfeife ist privat und gehört jemand anderem.

DBMS_PIPE Überblick über persistente Messaging-Pipes

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

In Autonomous Database verfügt das Package DBMS_PIPE über erweiterte Funktionen zur Unterstützung persistenter Messaging-Pipes.

Persistente Nachrichten in DBMS_PIPE:

  • Unterstützen Sie die Möglichkeit, sehr große Nachrichten zu senden und abzurufen.

  • Unterstützt eine große Anzahl von Pipe-Nachrichten.

  • Unterstützen Sie die gemeinsame Nutzung von Nachrichten innerhalb einer einzelnen Datenbank, über mehrere Datenbanken hinweg und über Datenbanken in verschiedenen Regionen hinweg.

  • Unterstützen Sie mehrere Pipes mit derselben Cloud-Objektspeicher-URI.

    Mit der persistenten Messagingfunktion können zwei oder mehr Datenbanksessions mit Nachrichten kommunizieren, die im Cloud-Objektspeicher gespeichert sind. Mit dieser Funktionalität können Nachrichten in einer Pipe nur der aktuellen Datenbank oder mehreren Datenbanken in derselben Region oder über verschiedene Regionen hinweg zur Verfügung gestellt werden.

    Bei einer persistenten Messaging Pipe kann es sich um einen der unterstützten DBMS_PIPE-Typen handeln:

    • Implizite Pipe: Wird automatisch erstellt, wenn eine Nachricht mit einem unbekannten Pipe-Namen mit der Funktion DBMS_PIPE.SEND_MESSAGE gesendet wird.
    • Explizite Pipe: Wird mit der Funktion DBMS_PIPE.CREATE_PIPE mit einem vom Benutzer angegebenen Pipe-Namen erstellt.
    • Öffentliche Pipe: Jeder Benutzer mit der Berechtigung EXECUTE für das Package DBMS_PIPE kann darauf zugreifen.
    • Private Pipe: Zugriff durch Sessions mit demselben Benutzer wie der Pipe-Ersteller möglich.
Hinweis

Wenn Sie Nachrichten über verschiedene Datenbanken hinweg mit persistenten Nachrichten senden und empfangen, empfiehlt Oracle, dass Sie DBMS_PIPE.CREATE_PIPE aufrufen, bevor Sie Nachrichten senden oder empfangen. Durch das Erstellen einer expliziten Pipe mit DBMS_PIPE.CREATE_PIPE wird sichergestellt, dass eine Pipe mit den gewünschten Zugriffsberechtigungen erstellt wird, entweder öffentlich oder privat (indem der Parameter PRIVATE auf FALSE gesetzt oder der Standardwert TRUE verwendet wird).

DBMS_PIPE Einschränkung

Das Package DBMS_PIPE unterstützt nicht das Senden von Nachrichten zwischen Datenbanken, die unterschiedliche Zeichensätze verwenden. Beispiel: Wenn Sie eine Autonomous Database-Instanz verwenden, die AL32UTF8 verwendet, und eine andere Instanz, die WE8MSWIN1252 verwendet, können Sie keine Nachrichten mit DBMS_PIPE zwischen diesen beiden Datenbanken senden. In diesem Fall löst das System den Fehler ORA-12704 aus, wenn Sie versuchen, Nachrichten mit DBMS_PIPE zwischen diesen beiden Datenbanken zu senden.

Weitere Informationen finden Sie unter Zeichensatz für Autonomous Database auswählen.

Zusammenfassung der DBMS_PIPE-Unterprogramme für Persistent Messaging

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

Tabelle 6-11: Unterprogramme des Packages DBMS_PIPE

Unterprogramm Beschreibung

Funktion CREATE_PIPE

Erstellt ein Rohr (für private Rohre erforderlich).

Funktion GET_CREDENTIAL_NAME

Gibt den globalen Variablenwert credential_name zurück.

Funktion GET_LOCATION_URI

Gibt den globalen Variablenwert location_uri zurück, der als Standardspeicherort-URI für die Verwendung beim Speichern einer Nachricht im Cloud-Objektspeicher verwendet wird.

Funktion NEXT_ITEM_TYPE

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

PACK_MESSAGE-Prozeduren

Erstellt Meldung im lokalen Puffer.

Funktion RECEIVE_MESSAGE

Kopiert die Nachricht aus der benannten Pipe in den lokalen Puffer.

Prozedur RESET_BUFFER

Löscht den Inhalt des lokalen Puffers.

Funktion REMOVE_PIPE

Entfernt die benannte Pipe.

Funktion SEND_MESSAGE

Sendet eine Nachricht an eine benannte Pipe: Dadurch wird implizit eine öffentliche Pipe erstellt, wenn die benannte Pipe nicht vorhanden ist.

Prozedur SET_CREDENTIAL_NAME

Legt die Variable credential_name fest, die als Standardzugangsdaten für Nachrichten verwendet wird, die im Cloud-Objektspeicher gespeichert sind.

Prozedur SET_LOCATION_URI

Legt die globale Variable location_uri fest, die als Standardspeicherort-URI für Nachrichten verwendet wird, die im Cloud-Objektspeicher gespeichert sind.

Funktion UNIQUE_SESSION_NAME

Gibt einen eindeutigen Sessionnamen zurück.

UNPACK_MESSAGE-Prozeduren

Greift im Puffer auf das nächste Element zu.

Funktion CREATE_PIPE

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

Explizit erstellte Pipes können nur entfernt werden, indem Sie REMOVE_PIPE aufrufen oder die Instanz herunterfahren.

Syntax

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

Parameter

Tabelle 6-12: Funktionsparameter CREATE_PIPE

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 in der ganzen Instanz eindeutig sein.

Achtung: Verwenden Sie keine Pipe-Namen, die mit ORA$ beginnen. Diese sind für die Verwendung durch von Oracle bereitgestellte Prozeduren reserviert. Pipename darf nicht länger als 128 Byte sein. Groß-/Kleinschreibung wird nicht beachtet. Derzeit darf der Name keine Globalization Support-Zeichen 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 diesen Höchstwert überschreitet.

Die Standard-maxpipesize beträgt 66536 Byte.

Die maxpipesize für eine Rohrleitung wird zu einem Teil der Eigenschaften der Rohrleitung und bleibt für die Lebensdauer der Rohrleitung 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.

Werte zurückgeben

Tabelle 6-13: Rückgabewerte der Funktion CREATE_PIPE

Zurückgehen 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 auf Erfolg hinweist, und alle Daten, die sich bereits in der Pipe befinden, bleiben erhalten.

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 den Benennungskonflikt anzeigt.

Ausnahmen

Tabelle 6-14: CREATE_PIPE Funktionsausnahme

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler: Pipe mit demselben Namen ist bereits vorhanden, und Sie dürfen sie nicht verwenden.

Beispiel

Erstellen Sie eine explizite Private namens MY_PIPE1.

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

Funktion GET_CREDENTIAL_NAME

Diese Funktion gibt den globalen Variablenwert credential_name zur Verwendung zurück, wenn Nachrichten im Cloud-Objektspeicher gespeichert werden.

Syntax

DBMS_PIPE.GET_CREDENTIAL_NAME
         RETURN VARCHAR2;

Werte zurückgeben

Rückgabewert Beschreibung

credential_name

Der Name der Zugangsdaten für den Zugriff auf den Cloud-Objektspeicher.

Beispiel

DECLARE
  credential_name     VARCHAR2(400)
BEGIN
  credential_name := DBMS_PIPE.GET_CREDENTIAL_NAME;
END;
/

Funktion GET_LOCATION_URI

Diese Funktion gibt den globalen Variablenwert location_uri zurück, der als Standardspeicherort-URI verwendet werden kann, wenn Pipe-Nachrichten im Cloud-Objektspeicher gespeichert werden.

Syntax

DBMS_PIPE.GET_LOCATION_URI
        RETURN VARCHAR2;

Rückgabewert

Rückgabewert Beschreibung
location_uri

Die Objekt-URI.

Beispiel

DECLARE
  location_uri     VARCHAR2(400)
BEGIN
  location_uri := DBMS_PIPE.GET_LOCATION_URI;
END;
/

Funktion RECEIVE_MESSAGE

Diese Funktion kopiert die Nachricht in den lokalen Nachrichtenpuffer.

Syntax

DBMS_PIPE.RECEIVE_MESSAGE (
   pipename          IN VARCHAR2,
   timeout           IN INTEGER  DEFAULT maxwait,
   credential_name   IN VARCHAR2 DEFAULT null,
   location_uri      IN VARCHAR2)
RETURN INTEGER;

Parameter

Tabelle 6-15: Funktionsparameter RECEIVE_MESSAGE

Parameter Beschreibung

pipename

Name der Pipe, auf der Sie eine Nachricht empfangen möchten.

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 ohne Blockierung lesen.

Der Timeout enthält nicht die Zeit, die für die Ausführung der Cachefunktion aufgewendet wurde, die mit dem Parameter cache_func angegeben wurde.

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

credential_name

Der Zugangsdatenname für den Cloud-Speicher zum Speichern von Nachrichten.

credential_name ist ein Packageargument, das standardmäßig mit NULL initialisiert wird.

Sie können diesen Wert festlegen, bevor Sie DBMS_PIPE.RECEIVE_MESSAGE aufrufen. Der übergebene Parameterwert hat Vorrang vor dem Wert der globalen Variable.

Das Zugangsdatenobjekt muss vom Benutzer, der DBMS_PIPE.RECEIVE_MESSAGE ausführt, die Berechtigungen EXECUTE und READ/WRITE aufweisen.

Der Wert credential_name kann ein OCI-Resource Principal, ein Azure-Service-Principal, ein Amazon-Ressourcenname (ARN) oder ein Google-Serviceaccount sein. Weitere Informationen zur Resource Principal-basierten Authentifizierung finden Sie unter Policys und Rollen für den Zugriff auf Ressourcen konfigurieren.

location_uri

Die Standort-URI für den Cloud-Speicher zum Speichern von Nachrichten.

Die globale Variable location_uri ist standardmäßig mit NULL initialisiert.

Sie können diesen Wert festlegen, bevor Sie DBMS_PIPE.RECEIVE_MESSAGE aufrufen. Der übergebene Parameterwert hat Vorrang vor dem Wert der globalen Variable.

Werte zurückgeben

Tabelle 6-16: Rückgabewerte der Funktion RECEIVE_MESSAGE

Zurückgehen Beschreibung

0

Erfolgreich

1

Timeout. 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

Interrupt aufgetreten.

ORA-23322

Der Benutzer hat keine ausreichenden Berechtigungen zum Lesen aus der Pipe.

Hinweise zur Verwendung

  • Um eine Nachricht von einer Pipe zu empfangen, rufen Sie zuerst RECEIVE_MESSAGE auf. Wenn Sie eine Nachricht erhalten, wird sie aus der Pipe entfernt. Daher kann eine Nachricht nur einmal empfangen werden. Bei implizit erstellten Rohren wird das Rohr entfernt, nachdem der letzte Datensatz aus dem Rohr entfernt wurde.

  • Wenn die Pipe, die Sie beim Aufrufen von RECEIVE_MESSAGE angeben, noch nicht vorhanden ist, erstellt Oracle die Pipe implizit und wartet auf den Empfang der Nachricht. Wenn die Nachricht nicht innerhalb eines bestimmten Timeoutintervalls ankommt, wird der Aufruf zurückgegeben und die Pipe entfernt.

  • Nachdem Sie die Nachricht erhalten haben, müssen Sie mindestens einen Aufruf an UNPACK_MESSAGE ausführen, um auf die einzelnen Elemente in der Nachricht zuzugreifen. Die Prozedur UNPACK_MESSAGE ist überladen, um Elemente vom Typ DATE, NUMBER, VARCHAR2 zu entpacken. Es gibt zwei zusätzliche Prozeduren zum Entpacken von RAW- und ROWID-Elementen. Wenn Sie den Typ der Daten nicht kennen, die Sie entpacken möchten, rufen Sie NEXT_ITEM_TYPE auf, um den Typ des nächsten Elements im Puffer zu bestimmen.

  • Persistente Nachrichten werden garantiert entweder von genau einem Prozess geschrieben oder gelesen. Dadurch wird eine Inkonsistenz des Nachrichteninhalts durch gleichzeitige Schreib- und Lesevorgänge verhindert. Mit einer persistenten Messaging-Pipe lässt DBMS_PIPE nur einen Vorgang zu, bei dem eine Nachricht oder eine empfangende Nachricht zu einem bestimmten Zeitpunkt aktiv sein kann. Wenn ein Vorgang jedoch aufgrund eines laufenden Vorgangs nicht möglich ist, wiederholt sich der Prozess in regelmäßigen Abständen, bis der Wert timeout erreicht ist.

  • Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

    • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

    • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

Ausnahmen

Tabelle 6-17: RECEIVE_MESSAGE Funktionsausnahmen

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler. Unzureichende Berechtigung zum Entfernen des Datensatzes aus der Pipe. Die Pfeife gehört jemand anderem.

Funktion SEND_MESSAGE

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.

Syntax

DBMS_PIPE.SEND_MESSAGE (
    pipename          IN VARCHAR2,
    timeout           IN INTEGER DEFAULT MAXWAIT,
    credential_name   IN VARCHAR2 DEFAULT null,
    location_uri      IN VARCHAR2 )
RETURN INTEGER;

Parameter

Tabelle 6-18: Funktionsparameter SEND_MESSAGE

Parameter Beschreibung
credential_name

Der Zugangsdatenname für den Cloud-Speicher zum Speichern von Nachrichten.

credential_name ist ein Packageargument, das standardmäßig mit NULL initialisiert wird.

Sie können diesen Wert festlegen, bevor Sie DBMS_PIPE.SEND_MESSAGE aufrufen. Der übergebene Parameterwert hat Vorrang vor dem Wert der globalen Variable.

Das Zugangsdatenobjekt muss vom Benutzer, der DBMS_PIPE.SEND_MESSAGE ausführt, die Berechtigungen EXECUTE und READ/WRITE aufweisen.

Der Wert credential_name kann ein OCI-Resource Principal, ein Azure-Service-Principal, ein Amazon-Ressourcenname (ARN) oder ein Google-Serviceaccount sein. Weitere Informationen zur Resource Principal-basierten Authentifizierung finden Sie unter Policys und Rollen für den Zugriff auf Ressourcen konfigurieren.

location_uri

Die Standort-URI für den Cloud-Speicher zum Speichern von Nachrichten.

Die globale Variable location_uri ist standardmäßig mit NULL initialisiert.

Sie können diesen Wert festlegen, bevor Sie DBMS_PIPE.SEND_MESSAGE aufrufen. Der übergebene Parameterwert hat Vorrang vor dem Wert der globalen Variable.

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 diesen Höchstwert überschreitet. Der Standardwert beträgt 65536 Byte.

Die maxpipesize für eine Rohrleitung wird zu einem Teil der Eigenschaften der Rohrleitung und bleibt für die Lebensdauer der Rohrleitung 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 Größe der Erstellungs-Pipe außer Kraft zu setzen.

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

pipename

Name der Pipe, auf der Sie die Nachricht platzieren möchten.

Wenn Sie eine explizite Pipe verwenden, ist dies der Name, den Sie beim Aufrufen 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. Dabei wird die Groß-/Kleinschreibung nicht beachtet. Derzeit darf der Name keine Globalization Support-Zeichen 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.

Werte zurückgeben

Tabelle 6-19: Rückgabewerte der Funktion SEND_MESSAGE

Zurückgehen 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 auf Erfolg hinweist, und alle Daten, die sich bereits in der Pipe befinden, bleiben erhalten.

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

1

Timeout.

Bei dieser Prozedur kann eine Zeitüberschreitung auftreten, da die Pipe nicht gesperrt werden kann oder weil die Pipe zu voll für die Verwendung bleibt. Wenn die Pipe implizit erstellt wurde und leer ist, wird sie entfernt.

3

Interrupt aufgetreten.

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

ORA-23322

Berechtigungen reichen nicht aus.

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

Hinweise zur Verwendung

  • Persistente Nachrichten werden garantiert entweder von genau einem Prozess geschrieben oder gelesen. Dadurch wird eine Inkonsistenz des Nachrichteninhalts durch gleichzeitige Schreib- und Lesevorgänge verhindert. Mit einer persistenten Messaging-Pipe lässt DBMS_PIPE nur einen Vorgang zu, bei dem eine Nachricht oder eine empfangende Nachricht zu einem bestimmten Zeitpunkt aktiv sein kann. Wenn ein Vorgang jedoch aufgrund eines laufenden Vorgangs nicht möglich ist, wiederholt sich der Prozess in regelmäßigen Abständen, bis der Wert timeout erreicht ist.

  • Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

    • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

    • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

Ausnahmen

Tabelle 6-20: SEND_MESSAGE Funktionsausnahme

Ausnahme: Beschreibung

Null pipe name

Berechtigungsfehler. Unzureichende Berechtigung zum Schreiben in die Pipe. Die Pfeife ist privat und gehört jemand anderem.

Prozedur SET_CREDENTIAL_NAME

Diese Prozedur legt die Variable credential_name fest, die als Standardzugangsdaten verwendet wird, wenn Pipe-Nachrichten im Cloud-Objektspeicher gespeichert werden.

Syntax

DBMS_PIPE.SET_CREDENTIAL_NAME (
   credential_name   IN VARCHAR2 );

Parameter

Parameter Beschreibung

credential_name

Der Name der Zugangsdaten für den Zugriff auf den Cloud-Objektspeicher.

Der Wert credential_name kann ein OCI-Resource Principal, ein Azure-Service-Principal, ein Amazon-Ressourcenname (ARN) oder ein Google-Serviceaccount sein. Weitere Informationen zur Resource Principal-basierten Authentifizierung finden Sie unter Policys und Rollen für den Zugriff auf Ressourcen konfigurieren.

Hinweis zur Verwendung

Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

  • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

  • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

Beispiel

BEGIN
     DBMS_PIPE.SET_CREDENTIAL_NAME(
       credential_name =>  'my_cred1');
END;
/

Prozedur SET_LOCATION_URI

Diese Prozedur legt die globale Variable location_uri fest.

Syntax

DBMS_PIPE.SET_LOCATION_URI (
   location_uri   IN VARCHAR2 );

Parameter

Parameter Beschreibung
location_uri

Objekt- oder Datei-URI. Das Format der URI ist vom verwendeten Cloud-Object Storage-Service abhängig. Weitere Informationen finden Sie unter DBMS_CLOUD-URI-Formate.

Hinweis zur Verwendung

Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

  • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

  • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

Beispiel

BEGIN
  DBMS_PIPE.GET_LOCATION_URI(
      location_uri  => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/');
END;
/