DBMS_PIPE-Package (Persistente Messaging-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 Kernfunktionalität DBMS_PIPE, wie in Oracle Database 19c verfügbar, sowie Erweiterungen.
Weitere Informationen zur in Oracle Database bereitgestellten 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 - Überblick für persistente Messaging-Pipes
Pipe-Funktionalität hat mehrere potenzielle Anwendungen: externe Serviceschnittstelle, Debugging, unabhängige Transaktionen und Warnungen.
In einer autonomen KI-Datenbank verfügt das DBMS_PIPE-Package über erweiterte Funktionen zur Unterstützung persistenter Messaging-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.
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 einzigen Datenbank, über mehrere Datenbanken und über Datenbanken in verschiedenen Regionen hinweg.
-
Unterstützt mehrere Pipes mit derselben Cloud-Objektspeicherort-URI.
Durch die persistente Messaging-Funktionalität 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 für die aktuelle Datenbank verfügbar gemacht werden oder sie können für mehrere Datenbanken in derselben Region oder in verschiedenen Regionen verfügbar gemacht werden.
Eine persistente Messaging-Pipe kann einer der unterstützten
DBMS_PIPE-Typen sein:-
Implizite Pipe: Wird automatisch erstellt, wenn eine Nachricht mit einem unbekannten Pipe-Namen mit der Funktion
DBMS_PIPE.SEND_MESSAGEgesendet wird. -
Explizite Pipe: Wird mit der Funktion
DBMS_PIPE.CREATE_PIPEmit einem benutzerdefinierten Pipe-Namen erstellt. -
Öffentliche Pipe: Zugriff durch jeden Benutzer mit der Berechtigung
EXECUTEfür das PackageDBMS_PIPE. -
Private Pipe: Zugriff durch Sessions mit demselben Benutzer wie der Pipe-Ersteller. Hinweis: Wenn Sie Nachrichten über verschiedene Datenbanken mit persistenten Nachrichten senden und empfangen, empfiehlt Oracle, dass Sie
DBMS_PIPE.CREATE_PIPEanrufen, bevor Sie Nachrichten senden oder empfangen. Durch das Erstellen einer expliziten Pipe mitDBMS_PIPE.CREATE_PIPEwird sichergestellt, dass eine Pipe mit den gewünschten Zugriffsberechtigungen (öffentlich oder privat) erstellt wird (indem der ParameterPRIVATEaufFALSEgesetzt oder der StandardwertTRUEverwendet wird).
-
DBMS_PIPE-Beschränkung
Das Package DBMS_PIPE unterstützt das Senden von Nachrichten zwischen Datenbanken, die unterschiedliche Zeichensätze verwenden, nicht. Beispiel: Wenn eine autonome KI-Datenbankinstanz AL32UTF8 und eine andere Instanz 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.
Zusammenfassung der DBMS_PIPE-Unterprogramme für persistentes Messaging
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). |
| 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 Standard-Speicherort-URI verwendet wird, wenn eine Nachricht im Cloud-Objektspeicher gespeichert wird. |
| NEXT_ITEM_TYPE (Funktion) |
Gibt den Datentyp des nächsten Elements im Puffer zurück. |
| PACK_MESSAGE-Verfahren |
Erstellt Meldung im lokalen Puffer. |
| RECEIVE_MESSAGE-Funktion | Kopiert die Nachricht aus der benannten Pipe in den lokalen Puffer. |
| Prozedur RESET_BUFFER |
Löscht den Inhalt des lokalen Puffers. |
| REMOVE_PIPE-Funktion |
Entfernt die benannte Pipe. |
| SEND_MESSAGE-Funktion | Sendet eine Nachricht an eine benannte Pipe: Dadurch wird implizit eine öffentliche Pipe erstellt, wenn die benannte Pipe nicht existiert. |
| Prozedur SET_CREDENTIAL_NAME | Legt die Variable credential_name fest, die als Standardzugangsdaten für Nachrichten verwendet wird, die im Cloud-Objektspeicher gespeichert sind. |
| SET_LOCATION_URI - Prozedur | Legt die globale location_uri-Variable fest, die als Standardverzeichnis-URI für Nachrichten verwendet wird, die im Cloud-Objektspeicher gespeichert sind. |
| 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.
Syntax
DBMS_PIPE.CREATE_PIPE (
pipename IN VARCHAR2,
maxpipesize IN INTEGER DEFAULT 66536,
private IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;
Parameter
| Parameter | Beschreibung |
|---|---|
pipename |
Name der Pipe, die Sie erstellen. Sie müssen diesen Namen verwenden, wenn Sie **Achtung:** Verwenden Sie keine Pipe-Namen, die mit |
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 Die Der Standardwert |
private |
Verwendet den Standardwert Öffentliche Pipes können implizit erstellt werden, wenn Sie |
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. |
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 |
Exceptions
| Ausnahme | Beschreibung |
|---|---|
Null pipe name |
Berechtigungsfehler: Pipe mit demselben Namen ist bereits vorhanden, und Sie dürfen ihn nicht verwenden. |
Beispiel
Erstellen Sie einen expliziten privaten Namen 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ück, der verwendet wird, wenn Nachrichten im Cloud-Objektspeicher gespeichert werden.
Syntax
DBMS_PIPE.GET_CREDENTIAL_NAME
RETURN VARCHAR2;
Rückgabewerte
| 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 Standardstandort-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;
/
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,
credential_name IN VARCHAR2 DEFAULT null,
location_uri IN VARCHAR2)
RETURN INTEGER;
Parameter
Tabelle - RECEIVE_MESSAGE-Funktionsparameter
| Parameter | Beschreibung |
|---|---|
pipename |
Name der Pipe, auf der eine Nachricht empfangen werden soll. Namen, die mit |
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 für die Ausführung der mit dem Parameter Standardwert: Die Konstante |
credential_name |
Der Zugangsdatenname für den Cloud-Speicher, der zum Speichern von Nachrichten verwendet wird.
Sie können diesen Wert festlegen, bevor Sie Das Zugangsdatenobjekt muss über die Berechtigungen |
location_uri |
Die Standort-URI für den Cloud-Speicher, der zum Speichern von Nachrichten verwendet wird. Die Sie können diesen Wert festlegen, bevor Sie |
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. |
ORA-23322 |
Der Benutzer hat keine ausreichenden Berechtigungen zum Lesen aus der Pipe. |
Verwendungshinweise
-
Um eine Nachricht von einer Pipe zu empfangen, rufen Sie zuerst
RECEIVE_MESSAGEauf. 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 Aufruf von
RECEIVE_MESSAGEangeben, noch nicht vorhanden ist, erstellt Oracle implizit die Pipe und wartet auf den Empfang der Nachricht. Wenn die Nachricht nicht innerhalb eines festgelegten 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_MESSAGEvornehmen, um auf die einzelnen Elemente in der Nachricht zuzugreifen. Die ProzedurUNPACK_MESSAGEwird überlastet, um Elemente des TypsDATE,NUMBER,VARCHAR2zu entpacken. Außerdem gibt es zwei zusätzliche Prozeduren zum Entpacken vonRAW- undROWID-Elementen. Wenn Sie den Typ der Daten, die Sie entpacken möchten, nicht kennen, rufen SieNEXT_ITEM_TYPEauf, 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 aufgrund gleichzeitiger Schreib- und Lesevorgänge verhindert. Mit einer persistenten Messaging-Pipe lässt
DBMS_PIPEzu, dass nur ein Vorgang, das Senden einer Nachricht oder einer Empfangsnachricht, zu einem bestimmten Zeitpunkt aktiv ist. Wenn ein Vorgang jedoch aufgrund eines laufenden Vorgangs nicht möglich ist, wiederholt der Prozess regelmäßig, bis der Werttimeouterreicht ist. -
Wenn Sie Nachrichten in Oracle Cloud Infrastructure Object Storage speichern, können Sie native Oracle Cloud Infrastructure-URIs oder Swift-URIs 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 Authentifizierung mit nativen Oracle Cloud Infrastructure-Signaturschlüsseln im Zugangsdatenobjekt verwenden.
-
Wenn Sie das Swift-URI-Format für den Zugriff auf Oracle Cloud Infrastructure Object Storage verwenden, müssen Sie eine Authentifizierungstokenauthentifizierung im Zugangsdatenobjekt verwenden.
-
Exceptions
Tabelle - RECEIVE_MESSAGE-Funktionsausnahmen
| Ausnahme | Beschreibung |
|---|---|
Null pipe name |
Berechtigungsfehler. Unzureichende Berechtigung zum Entfernen des Datensatzes aus der Pipe. Die Pipe gehört einer anderen Person. |
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.
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 - Parameter der Funktion SEND_MESSAGE
| Parameter | Beschreibung |
|---|---|
credential_name |
Der Zugangsdatenname für den Cloud-Speicher, der zum Speichern von Nachrichten verwendet wird.
Sie können diesen Wert festlegen, bevor Sie Das Zugangsdatenobjekt muss über die Berechtigungen |
location_uri |
Die Standort-URI für den Cloud-Speicher, der zum Speichern von Nachrichten verwendet wird. Die Sie können diesen Wert festlegen, bevor Sie |
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 Wenn Sie Der Standardwert |
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 **Achtung:** Verwenden Sie keine Pipe-Namen, die mit " |
timeout |
Wartezeit beim Versuch, eine Nachricht in einer Pipe zu platzieren, in Sekunden. Der Standardwert ist die Konstante |
Rückgabewerte
Tabelle - Rückgabewerte der Funktion SEND_MESSAGE
| 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 |
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. |
ORA-23322 |
Unzureichende Berechtigungen. Wenn eine Pipe mit demselben Namen vorhanden ist und von einem anderen Benutzer erstellt wurde, gibt Oracle den Fehler |
Verwendungshinweise
-
Persistente Nachrichten werden garantiert entweder von genau einem Prozess geschrieben oder gelesen. Dadurch wird eine Inkonsistenz des Nachrichteninhalts aufgrund gleichzeitiger Schreib- und Lesevorgänge verhindert. Mit einer persistenten Messaging-Pipe lässt
DBMS_PIPEzu, dass nur ein Vorgang, das Senden einer Nachricht oder einer Empfangsnachricht, zu einem bestimmten Zeitpunkt aktiv ist. Wenn ein Vorgang jedoch aufgrund eines laufenden Vorgangs nicht möglich ist, wiederholt der Prozess regelmäßig, bis der Werttimeouterreicht ist. -
Wenn Sie Nachrichten in Oracle Cloud Infrastructure Object Storage speichern, können Sie native Oracle Cloud Infrastructure-URIs oder Swift-URIs 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 Authentifizierung mit nativen Oracle Cloud Infrastructure-Signaturschlüsseln im Zugangsdatenobjekt verwenden.
-
Wenn Sie das Swift-URI-Format für den Zugriff auf Oracle Cloud Infrastructure Object Storage verwenden, müssen Sie eine Authentifizierungstokenauthentifizierung im Zugangsdatenobjekt verwenden.
-
Exceptions
Tabelle - Ausnahme für SEND_MESSAGE-Funktion
| 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. |
Hinweis zur Verwendung
Wenn Sie Nachrichten in Oracle Cloud Infrastructure Object Storage speichern, können Sie native Oracle Cloud Infrastructure-URIs oder Swift-URIs 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 Authentifizierung mit nativen Oracle Cloud Infrastructure-Signaturschlüsseln im Zugangsdatenobjekt verwenden.
-
Wenn Sie das Swift-URI-Format für den Zugriff auf Oracle Cloud Infrastructure Object Storage verwenden, müssen Sie eine Authentifizierungstokenauthentifizierung im Zugangsdatenobjekt verwenden.
Beispiel
BEGIN
DBMS_PIPE.SET_CREDENTIAL_NAME(
credential_name => 'my_cred1');
END;
/
SET_LOCATION_URI - Prozedur
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-Objektspeicherservice abhängig. Weitere Einzelheiten finden Sie unter URI-Formate für Cloud-Objektspeicher. |
Hinweis zur Verwendung
Wenn Sie Nachrichten in Oracle Cloud Infrastructure Object Storage speichern, können Sie native Oracle Cloud Infrastructure-URIs oder Swift-URIs 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 Authentifizierung mit nativen Oracle Cloud Infrastructure-Signaturschlüsseln im Zugangsdatenobjekt verwenden.
-
Wenn Sie das Swift-URI-Format für den Zugriff auf Oracle Cloud Infrastructure Object Storage verwenden, müssen Sie eine Authentifizierungstokenauthentifizierung 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;
/