Package DBMS_PIPE (Pipes di messaggistica persistenti)
Il pacchetto DBMS_PIPE consente a due o più sessioni nella stessa istanza di comunicare.
Oracle Autonomous AI Database on Dedicated Exadata Infrastructure supporta la funzionalità DBMS_PIPE di base, come disponibile in Oracle Database 19c, oltre alle estensioni.
Per informazioni dettagliate sulla funzionalità DBMS_PIPE di base fornita in Oracle Database, vedere DBMS_PIPE in Oracle Database 19c PL/SQL Packages and Types Reference oppure Oracle Database 26ai PL/SQL Packages and Types Reference.
Panoramica di DBMS_PIPE per le pipeline di messaggistica persistente
La funzionalità Pipe ha diverse potenziali applicazioni: interfaccia di servizio esterna, debug, transazioni indipendenti e avvisi.
In Autonomous AI Database, il package DBMS_PIPE dispone di funzionalità estese per supportare i pipe di messaggistica persistenti. Per ulteriori informazioni, vedere DBMS_PIPE in Oracle Database 19c PL/SQL Packages and Types Reference oppure Oracle Database 26ai PL/SQL Packages and Types Reference.
Messaggi persistenti in DBMS_PIPE:
-
Supporta la possibilità di inviare e recuperare messaggi di grandi dimensioni.
-
Supporta un numero elevato di messaggi pipe.
-
Supporta la condivisione di messaggi all'interno di un singolo database, su più database e tra database in aree diverse.
-
Supporta più pipe utilizzando lo stesso URI di posizione dell'area di memorizzazione degli oggetti cloud.
La funzionalità di messaggistica persistente consente a due o più sessioni di database di comunicare con i messaggi memorizzati nell'area di memorizzazione degli oggetti cloud. L'utilizzo di questa funzionalità in una pipe può essere reso disponibile solo per il database corrente oppure può essere reso disponibile per più database nella stessa area o in aree diverse.
Un pipe di messaggistica persistente può essere uno qualsiasi dei tipi
DBMS_PIPEsupportati:-
Tubo implicito: creato automaticamente quando un messaggio viene inviato con un nome pipe sconosciuto utilizzando la funzione
DBMS_PIPE.SEND_MESSAGE. -
Tubo esplicito: creato utilizzando la funzione
DBMS_PIPE.CREATE_PIPEcon un nome di pipe specificato dall'utente. -
Public Pipe: accessibile da qualsiasi utente con autorizzazione
EXECUTEsul pacchettoDBMS_PIPE. -
Tubo privato: accessibile da sessioni con lo stesso utente dell'autore della pipe. Nota: quando si inviano e ricevono messaggi in database diversi utilizzando messaggi persistenti, Oracle consiglia di chiamare il numero
DBMS_PIPE.CREATE_PIPEprima di inviare o ricevere messaggi. La creazione di una pipe esplicita conDBMS_PIPE.CREATE_PIPEgarantisce la creazione di una pipe con le autorizzazioni di accesso desiderate, pubblica o privata (impostando il parametroPRIVATEsuFALSEo utilizzando il valore predefinitoTRUE).
-
Limitazione DBMS_PIPE
Il pacchetto DBMS_PIPE non supporta l'invio di messaggi tra database che utilizzano set di caratteri diversi. Ad esempio, se si dispone di un'istanza di Autonomous AI Database che utilizza AL32UTF8 e un'altra che utilizza WE8MSWIN1252, non è possibile inviare messaggi con DBMS_PIPE tra questi due database. In questo caso, il sistema solleverà l'errore ORA-12704 se si tenta di inviare messaggi con DBMS_PIPE tra questi due database.
Riepilogo dei sottoprogrammi DBMS_PIPE per la messaggistica persistente
Questa tabella elenca i sottoprogrammi DBMS_PIPE e li descrive brevemente.
| Sottoprogramma | Descrizione |
|---|---|
| Funzione CREATE_PIPE | Crea un tubo (necessario per tubi privati). |
| Funzione GET_CREDENTIAL_NAME | Restituisce il valore della variabile credential_name globale. |
| Funzione GET_LOCATION_URI | Restituisce il valore della variabile location_uri globale utilizzato come URI di posizione predefinito da utilizzare quando un messaggio viene memorizzato nell'area di memorizzazione degli oggetti cloud. |
| Funzione NEXT_ITEM_TYPE |
Restituisce il tipo di dati dell'elemento successivo nel buffer. |
| Procedure PACK_MESSAGE |
Genera il messaggio nel buffer locale. |
| Funzione RECEIVE_MESSAGE | Copia il messaggio dalla named pipe nel buffer locale. |
| Procedura RESET_BUFFER |
Rimuove il contenuto del buffer locale. |
| Funzione REMOVE_PIPE |
Rimuove la pipe denominata. |
| Funzione SEND_MESSAGE | Invia un messaggio a una pipe denominata: questa operazione crea implicitamente una pipe pubblica se la pipe denominata non esiste. |
| Procedura SET_CREDENTIAL_NAME | Imposta la variabile credential_name utilizzata come credenziale predefinita per i messaggi memorizzati nell'area di memorizzazione degli oggetti cloud. |
| Procedura SET_LOCATION_URI | Imposta la variabile location_uri globale utilizzata come URI di posizione predefinito per i messaggi memorizzati nell'area di memorizzazione degli oggetti cloud. |
| Funzione UNIQUE_SESSION_NAME |
Restituisce un nome di sessione univoco. |
| Procedure UNPACK_MESSAGE |
Consente di accedere all'elemento successivo nel buffer. |
Funzione CREATE_PIPE
Questa funzione crea in modo esplicito una pipe pubblica o privata. Se il flag private è TRUE, l'autore della pipe viene assegnato come proprietario della pipe privata.
I tubi creati in modo esplicito possono essere rimossi solo chiamando REMOVE_PIPE o chiudendo l'istanza.
Sintassi
DBMS_PIPE.CREATE_PIPE (
pipename IN VARCHAR2,
maxpipesize IN INTEGER DEFAULT 66536,
private IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;
Parametri
| Parametro | Descrizione |
|---|---|
pipename |
Nome della pipe che si sta creando. È necessario utilizzare questo nome quando si chiamano **Attenzione:** non utilizzare nomi di pipe che iniziano con |
maxpipesize |
La dimensione massima consentita per la pipe, in byte. La dimensione totale per tutti i messaggi nella pipe non può superare questa quantità. Il messaggio viene bloccato se supera questo limite massimo. Il valore predefinito Il Il valore predefinito |
private |
Utilizza il valore predefinito I tubi pubblici possono essere creati in modo implicito quando si chiama |
Valori restituiti
| Return | Descrizione |
|---|---|
0 |
Operazione riuscita. Se la pipe esiste già e l'utente che sta tentando di crearla è autorizzato a utilizzarla, Oracle restituisce 0, indicando l'esito positivo e tutti i dati già presenti nella pipe rimangono. |
ORA-23322 |
Errore a causa di un conflitto di denominazione. Se esiste una pipe con lo stesso nome ed è stata creata da un utente diverso, Oracle segnala l'errore |
Eccezioni
| Eccezione | Descrizione |
|---|---|
Null pipe name |
Errore di autorizzazione: un pipe con lo stesso nome esiste già e non è consentito utilizzarlo. |
Esempio
Creare un nome privato esplicito denominato MY_PIPE1
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(
pipename => 'MY_PIPE1',
private => TRUE);
END;
/
Funzione GET_CREDENTIAL_NAME
Questa funzione restituisce il valore della variabile credential_name globale da utilizzare quando i messaggi vengono memorizzati nell'area di memorizzazione degli oggetti cloud.
Sintassi
DBMS_PIPE.GET_CREDENTIAL_NAME
RETURN VARCHAR2;
Valori restituiti
| Valore restituito | Descrizione |
|---|---|
credential_name |
Nome della credenziale per accedere allo storage degli oggetti cloud. |
Esempio
DECLARE
credential_name VARCHAR2(400)
BEGIN
credential_name := DBMS_PIPE.GET_CREDENTIAL_NAME;
END;
/
Funzione GET_LOCATION_URI
Questa funzione restituisce il valore della variabile location_uri globale che può essere utilizzato come URI di posizione predefinito quando i messaggi pipe vengono memorizzati nell'area di memorizzazione degli oggetti cloud.
Sintassi
DBMS_PIPE.GET_LOCATION_URI
RETURN VARCHAR2;
Valore restituito
| Valore restituito | Descrizione |
|---|---|
location_uri |
URI oggetto. |
Esempio
DECLARE
location_uri VARCHAR2(400)
BEGIN
location_uri := DBMS_PIPE.GET_LOCATION_URI;
END;
/
Funzione RECEIVE_MESSAGE
Questa funzione copia il messaggio nel buffer dei messaggi locale.
Sintassi
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT maxwait,
credential_name IN VARCHAR2 DEFAULT null,
location_uri IN VARCHAR2)
RETURN INTEGER;
Parametri
Tabella - Parametri funzione RECEIVE_MESSAGE
| Parametro | Descrizione |
|---|---|
pipename |
Nome della pipe in cui si desidera ricevere un messaggio. I nomi che iniziano con |
timeout |
Tempo di attesa di un messaggio, in secondi. Un timeout di 0 ti permette di leggere senza bloccare. Il timeout non include il tempo impiegato per eseguire la funzione cache specificata con il parametro Valore predefinito: è la costante |
credential_name |
Nome della credenziale per l'area di memorizzazione cloud utilizzata per memorizzare i messaggi.
È possibile impostare questo valore prima di chiamare L'oggetto credenziale deve disporre dei privilegi |
location_uri |
URI di posizione per il cloud store utilizzato per memorizzare i messaggi.
È possibile impostare questo valore prima di chiamare |
Valori restituiti
Tabella - Valori restituiti funzione RECEIVE_MESSAGE
| Return | Descrizione |
|---|---|
0 |
Operazione riuscita |
1 |
Timeout. Se la pipe è stata creata implicitamente ed è vuota, viene rimossa. |
2 |
Il record nella pipe è troppo grande per il buffer. |
3 |
Si è verificata un'interruzione. |
ORA-23322 |
L'utente non dispone di privilegi sufficienti per leggere dalla pipe. |
Note sull'uso
-
Per ricevere un messaggio da una pipe, chiamare prima
RECEIVE_MESSAGE. Quando si riceve un messaggio, viene rimosso dalla pipe; quindi, un messaggio può essere ricevuto solo una volta. Per i tubi creati in modo implicito, la pipe viene rimossa dopo la rimozione dell'ultimo record dalla pipe. -
Se la pipe specificata quando si chiama
RECEIVE_MESSAGEnon esiste già, Oracle crea la pipe in modo implicito e attende di ricevere il messaggio. Se il messaggio non arriva entro un determinato intervallo di timeout, la chiamata viene restituita e la pipe viene rimossa. -
Dopo aver ricevuto il messaggio, è necessario effettuare una o più chiamate a
UNPACK_MESSAGEper accedere ai singoli elementi del messaggio. La proceduraUNPACK_MESSAGEviene sovraccaricata per disimballare gli elementi di tipoDATE,NUMBER,VARCHAR2e sono disponibili due procedure aggiuntive per disimballare gli elementiRAWeROWID. Se non si conosce il tipo di dati che si sta tentando di decomprimere, chiamareNEXT_ITEM_TYPEper determinare il tipo di elemento successivo nel buffer. -
I messaggi persistenti possono essere scritti o letti da un solo processo. Ciò impedisce l'incoerenza del contenuto del messaggio a causa di scritture e letture concorrenti. Utilizzando una pipe di messaggistica persistente,
DBMS_PIPEconsente di attivare una sola operazione, ovvero l'invio di un messaggio o di un messaggio di ricezione alla volta. Tuttavia, se un'operazione non è possibile a causa di un'operazione in corso, il processo esegue un nuovo tentativo periodicamente fino al raggiungimento del valoretimeout. -
Se utilizzi Oracle Cloud Infrastructure Object Storage per memorizzare i messaggi, puoi utilizzare gli URI nativi di Oracle Cloud Infrastructure o gli URI Swift. Tuttavia, l'URI della posizione e la credenziale devono corrispondere nel tipo riportato di seguito.
-
Se utilizzi un formato URI nativo per accedere a Oracle Cloud Infrastructure Object Storage, devi utilizzare l'autenticazione delle chiavi di firma Oracle Cloud Infrastructure native nell'oggetto credenziali.
-
Se si utilizza il formato URI Swift per accedere a Oracle Cloud Infrastructure Object Storage, è necessario utilizzare un'autenticazione del token di autenticazione nell'oggetto credenziali.
-
Eccezioni
Tabella - Eccezioni funzione RECEIVE_MESSAGE
| Eccezione | Descrizione |
|---|---|
Null pipe name |
Errore di autorizzazione. Privilegi insufficienti per rimuovere il record dalla pipe. La pipe è di proprietà di un altro utente. |
Funzione SEND_MESSAGE
Questa funzione invia un messaggio sulla pipe denominata.
Il messaggio è contenuto nel buffer dei messaggi locale, che è stato riempito con chiamate a PACK_MESSAGE. È possibile creare una pipe in modo esplicito utilizzando CREATE_PIPE, altrimenti viene creata in modo implicito.
Sintassi
DBMS_PIPE.SEND_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT MAXWAIT,
credential_name IN VARCHAR2 DEFAULT null,
location_uri IN VARCHAR2 )
RETURN INTEGER;
Parametri
Tabella - Parametri funzione SEND_MESSAGE
| Parametro | Descrizione |
|---|---|
credential_name |
Nome della credenziale per l'area di memorizzazione cloud utilizzata per memorizzare i messaggi.
È possibile impostare questo valore prima di chiamare L'oggetto credenziale deve disporre dei privilegi |
location_uri |
URI di posizione per il cloud store utilizzato per memorizzare i messaggi.
È possibile impostare questo valore prima di chiamare |
maxpipesize |
Dimensione massima consentita per la pipe, in byte. La dimensione totale per tutti i messaggi nella pipe non può superare questa quantità. Il messaggio viene bloccato se supera questo limite massimo. Il valore predefinito è di 65536 byte. Il La specifica di Il valore predefinito |
pipename |
Nome della pipe su cui si desidera posizionare il messaggio. Se si utilizza una pipe esplicita, questo è il nome specificato quando si chiama **Attenzione:** non utilizzare nomi di pipe che iniziano con ' |
timeout |
Tempo di attesa durante il tentativo di posizionare un messaggio su una pipe, in secondi. Il valore predefinito è la costante |
Valori restituiti
Tabella - Valori restituiti funzione SEND_MESSAGE
| Return | Descrizione |
|---|---|
0 |
Operazione riuscita. Se la pipe esiste già e l'utente che sta tentando di crearla è autorizzato a utilizzarla, Oracle restituisce 0, indicando l'esito positivo e tutti i dati già presenti nella pipe rimangono. Se un utente connesso come |
1 |
Timeout. Questa procedura può scadere perché non è possibile ottenere un blocco sulla pipe o perché la pipe rimane troppo piena per essere utilizzata. Se la pipe è stata creata implicitamente ed è vuota, viene rimossa. |
3 |
Si è verificata un'interruzione. Se la pipe è stata creata implicitamente ed è vuota, viene rimossa. |
ORA-23322 |
Privilegi insufficienti. Se esiste una pipe con lo stesso nome ed è stata creata da un utente diverso, Oracle segnala l'errore |
Note sull'uso
-
I messaggi persistenti possono essere scritti o letti da un solo processo. Ciò impedisce l'incoerenza del contenuto del messaggio a causa di scritture e letture concorrenti. Utilizzando una pipe di messaggistica persistente,
DBMS_PIPEconsente l'attivazione di una sola operazione, ovvero l'invio di un messaggio o di un messaggio di ricezione alla volta. Tuttavia, se un'operazione non è possibile a causa di un'operazione in corso, il processo esegue un nuovo tentativo periodicamente fino al raggiungimento del valoretimeout. -
Se utilizzi Oracle Cloud Infrastructure Object Storage per memorizzare i messaggi, puoi utilizzare gli URI nativi di Oracle Cloud Infrastructure o gli URI Swift. Tuttavia, l'URI della posizione e la credenziale devono corrispondere nel tipo riportato di seguito.
-
Se utilizzi un formato URI nativo per accedere a Oracle Cloud Infrastructure Object Storage, devi utilizzare l'autenticazione delle chiavi di firma Oracle Cloud Infrastructure native nell'oggetto credenziali.
-
Se si utilizza il formato URI Swift per accedere a Oracle Cloud Infrastructure Object Storage, è necessario utilizzare un'autenticazione del token di autenticazione nell'oggetto credenziali.
-
Eccezioni
Tabella - Eccezione funzione SEND_MESSAGE
| Eccezione | Descrizione |
|---|---|
Null pipe name |
Errore di autorizzazione. Privilegi insufficienti per scrivere nella pipe. La pipa è privata e di proprietà di qualcun altro. |
Procedura SET_CREDENTIAL_NAME
Questa procedura imposta la variabile credential_name utilizzata come credenziale predefinita quando i messaggi pipe vengono memorizzati nell'area di memorizzazione degli oggetti cloud.
Sintassi
DBMS_PIPE.SET_CREDENTIAL_NAME (
credential_name IN VARCHAR2 );
Parametri
| Parametro | Descrizione |
|---|---|
credential_name |
Nome della credenziale per accedere allo storage degli oggetti cloud. |
Nota per l'uso
Se utilizzi Oracle Cloud Infrastructure Object Storage per memorizzare i messaggi, puoi utilizzare gli URI nativi di Oracle Cloud Infrastructure o gli URI Swift. Tuttavia, l'URI della posizione e la credenziale devono corrispondere nel tipo riportato di seguito.
-
Se utilizzi un formato URI nativo per accedere a Oracle Cloud Infrastructure Object Storage, devi utilizzare l'autenticazione delle chiavi di firma Oracle Cloud Infrastructure native nell'oggetto credenziali.
-
Se si utilizza il formato URI Swift per accedere a Oracle Cloud Infrastructure Object Storage, è necessario utilizzare un'autenticazione del token di autenticazione nell'oggetto credenziali.
Esempio
BEGIN
DBMS_PIPE.SET_CREDENTIAL_NAME(
credential_name => 'my_cred1');
END;
/
Procedura SET_LOCATION_URI
Questa procedura imposta la variabile globale location_uri.
Sintassi
DBMS_PIPE.SET_LOCATION_URI (
location_uri IN VARCHAR2 );
Parametro
| Parametro | Descrizione |
|---|---|
location_uri |
URI oggetto o file. Il formato dell'URI dipende dal servizio di storage degli oggetti cloud in uso. Per i dettagli, vedere Formati URI di storage degli oggetti cloud. |
Nota per l'uso
Se utilizzi Oracle Cloud Infrastructure Object Storage per memorizzare i messaggi, puoi utilizzare gli URI nativi di Oracle Cloud Infrastructure o gli URI Swift. Tuttavia, l'URI della posizione e la credenziale devono corrispondere nel tipo riportato di seguito.
-
Se utilizzi un formato URI nativo per accedere a Oracle Cloud Infrastructure Object Storage, devi utilizzare l'autenticazione delle chiavi di firma Oracle Cloud Infrastructure native nell'oggetto credenziali.
-
Se si utilizza il formato URI Swift per accedere a Oracle Cloud Infrastructure Object Storage, è necessario utilizzare un'autenticazione del token di autenticazione nell'oggetto credenziali.
Esempio
BEGIN
DBMS_PIPE.GET_LOCATION_URI(
location_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/');
END;
/