DBMS_PIPE 套裝程式 (永久訊息管道)
DBMS_PIPE 套裝程式可讓相同執行處理中的兩個或多個階段作業進行通訊。
Oracle Autonomous AI Database on Dedicated Exadata Infrastructure 支援 Oracle Database 19c 提供的核心 DBMS_PIPE 功能以及擴充功能。
請參閱 Oracle Database 19c PL/SQL Packages and Types Reference 中的 DBMS_PIPE 或 Oracle Database 26ai PL/SQL Packages and Types Reference ,瞭解 Oracle Database 中提供之核心 DBMS_PIPE 功能的詳細資訊。
永久訊息管道的 DBMS_PIPE 總覽
管線功能具有數個潛在的應用程式:外部服務介面、除錯、獨立交易及警示。
在自治式 AI 資料庫上,DBMS_PIPE 套裝程式具有擴充的功能,可支援持續性訊息傳遞管道。請參閱 Oracle Database 19c PL/SQL Packages and Types Reference 中的 DBMS_PIPE 或 Oracle Database 26ai PL/SQL Packages and Types Reference ,瞭解詳細資訊。
DBMS_PIPE 中的永久訊息:
-
支援傳送及擷取非常大型訊息的功能。
-
支援大量的管路訊息。
-
支援在單一資料庫內、跨多個資料庫,以及跨不同區域的資料庫共用訊息。
-
支援使用相同雲端物件存放區位置 URI 的多個管線。
永久訊息傳遞功能可讓兩個或多個資料庫階段作業與儲存在「雲端物件存放區」中的訊息進行通訊。在管路中使用此功能訊息只能供目前的資料庫使用,或者可以讓管路中的多個資料庫在同一區域或不同區域使用。
「永久訊息管道」可以是任何一種支援的
DBMS_PIPE類型:-
隱含管:使用
DBMS_PIPE.SEND_MESSAGE函數以不明的管路名稱傳送訊息時,會自動建立。 -
明確管線:使用
DBMS_PIPE.CREATE_PIPE函數與使用者指定的管線名稱建立。 -
公用管線:任何具備
DBMS_PIPE套裝程式之EXECUTE權限的使用者都可以存取。 -
專用管線:具有與管線建立者相同之使用者的階段作業可以存取。注意:使用永久訊息在不同資料庫間傳送和接收訊息時,Oracle 建議您先呼叫
DBMS_PIPE.CREATE_PIPE,再傳送或接收訊息。使用DBMS_PIPE.CREATE_PIPE建立明確的管道可確保使用您想要的存取權限 (將PRIVATE參數設定為FALSE或使用預設值TRUE) 建立管道。
-
DBMS_PIPE 限制
DBMS_PIPE 套裝程式不支援在使用不同字元集的資料庫之間傳送訊息。例如,如果您有一個使用 AL32UTF8 的自治式 AI 資料庫執行處理,以及另一個使用 WE8MSWIN1252 的執行處理,您就無法在這兩個資料庫之間傳送含有 DBMS_PIPE 的訊息。在此情況下,如果您嘗試在這兩個資料庫之間傳送含有 DBMS_PIPE 的訊息,系統將會發出 ORA-12704 錯誤。
永久訊息的 DBMS_PIPE 子程式摘要
此表格列出 DBMS_PIPE 子程式,並簡短說明它們。
| 子程式 | 描述 |
|---|---|
| CREATE_PIPE 函數 | 建立管 (私有管是必要的)。 |
| GET_CREDENTIAL_NAME 函數 | 傳回全域 credential_name 變數值。 |
| GET_LOCATION_URI 函數 | 傳回當訊息儲存在「雲端物件存放區」中時,用來作為預設位置 URI 的全域 location_uri 變數值。 |
| NEXT_ITEM_TYPE 函數 |
傳回緩衝區中下一個項目的資料類型。 |
| PACK_MESSAGE 程序 |
在本地端緩衝區內建立訊息 。 |
| RECEIVE_MESSAGE 函數 | 將已命名管道的訊息複製到本機緩衝區。 |
| RESET_BUFFER 程序 |
清除本機緩衝區的內容。 |
| REMOVE_PIPE 函數 |
移除已命名管道。 |
| SEND_MESSAGE 函數 | 在具名管道上傳送訊息:如果具名管道不存在,這會以隱含方式建立公用管道。 |
| SET_CREDENTIAL_NAME 程序 | 針對儲存在「雲端物件存放區」中的訊息,設定作為預設證明資料的 credential_name 變數。 |
| SET_LOCATION_URI 程序 | 針對儲存在「雲端物件存放區」中的訊息,設定作為預設位置 URI 的全域 location_uri 變數。 |
| UNIQUE_SESSION_NAME 函數 |
傳回唯一的階段作業名稱。 |
| UNPACK_MESSAGE 程序 |
存取緩衝區中的下一個項目。 |
CREATE_PIPE 函數
此函數會明確地建立公用或專用管道。如果 private 旗標為 TRUE,則會將管道建立者指派為專用管道的擁有者。
明確建立的管線只能透過呼叫 REMOVE_PIPE 或關閉執行處理來移除。
語法
DBMS_PIPE.CREATE_PIPE (
pipename IN VARCHAR2,
maxpipesize IN INTEGER DEFAULT 66536,
private IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;
參數
| Parameter - 參數 | 描述 |
|---|---|
pipename |
您正在建立的管的名稱。 當您呼叫 ** 注意:** 請勿使用以 |
maxpipesize |
允許的管道大小上限 (位元組)。 管道上所有訊息的總大小不得超過此金額。訊息若超過此上限,就會被封鎖。 預設的 管的 65536 的預設 |
private |
使用預設值 當您呼叫 |
傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功。 如果管已存在,且嘗試建立管路的使用者已獲授權使用該管路,則 Oracle 會傳回 0,表示成功,且管路中已存在的任何資料都會保留。 |
ORA-23322 |
命名衝突導致失敗。 如果有相同名稱的管道存在,而且是由其他使用者所建立,則 Oracle 會發出錯誤 |
異常狀況
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤:已經有相同名稱的管線存在,不允許使用。 |
範例
建立名為 MY_PIPE1 的明確專用
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(
pipename => 'MY_PIPE1',
private => TRUE);
END;
/
GET_CREDENTIAL_NAME 函數
此函數會傳回將訊息儲存至「雲端物件存放區」時所使用的全域 credential_name 變數值。
語法
DBMS_PIPE.GET_CREDENTIAL_NAME
RETURN VARCHAR2;
傳回值
| 傳回值 | 描述 |
|---|---|
credential_name |
存取雲端物件儲存的證明資料名稱。 |
範例
DECLARE
credential_name VARCHAR2(400)
BEGIN
credential_name := DBMS_PIPE.GET_CREDENTIAL_NAME;
END;
/
GET_LOCATION_URI 函數
此函數會傳回將管路訊息儲存至「雲端物件存放區」時,可作為預設位置 URI 的全域 location_uri 變數值。
語法
DBMS_PIPE.GET_LOCATION_URI
RETURN VARCHAR2;
傳回值
| 傳回值 | 描述 |
|---|---|
location_uri |
物件 URI。 |
範例
DECLARE
location_uri VARCHAR2(400)
BEGIN
location_uri := DBMS_PIPE.GET_LOCATION_URI;
END;
/
RECEIVE_MESSAGE 函數
此功能會將訊息複製到本機訊息緩衝區。
語法
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT maxwait,
credential_name IN VARCHAR2 DEFAULT null,
location_uri IN VARCHAR2)
RETURN INTEGER;
參數
表格 - RECEIVE_MESSAGE 函數參數
| Parameter - 參數 | 描述 |
|---|---|
pipename |
您要接收訊息的管道名稱。 以 |
timeout |
等待訊息的時間 (秒)。逾時 0 表示不被封鎖,讓您讀取資料。 逾時不包括執行以 預設值:常數 |
credential_name |
用來儲存訊息之雲端存放區的證明資料名稱。
您可以在呼叫 執行 |
location_uri |
用來儲存訊息之雲端存放區的位置 URI。
您可以在呼叫 |
傳回值
表格 - RECEIVE_MESSAGE 函數傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功 |
1 |
已逾時。如果管是隱含建立的,而且是空的,則會移除該管。 |
2 |
管線中的記錄對緩衝區而言太大。 |
3 |
發生中斷。 |
ORA-23322 |
使用者的權限不足,無法從管道讀取。 |
使用注意事項
-
若要從管道接收訊息,請先呼叫
RECEIVE_MESSAGE。當您收到訊息時,該訊息會從管道中移除;因此,訊息只能接收一次。對於隱含建立的管,在從管中移除最後一筆記錄後,管就會被移除。 -
如果您在呼叫
RECEIVE_MESSAGE時指定的管道不存在,則 Oracle 會以隱含方式建立管道並等待接收訊息。如果訊息未在指定的逾時間隔內到達,則會傳回呼叫並移除管道。 -
在收到訊息後,您必須撥打一或多次
UNPACK_MESSAGE來存取訊息中的個別項目。UNPACK_MESSAGE程序已超載以解壓縮類型為DATE、NUMBER、VARCHAR2的項目,另外還有兩個程序可解壓縮RAW和ROWID項目。如果您不知道嘗試解壓縮的資料類型,請呼叫NEXT_ITEM_TYPE來決定緩衝區中下一個項目的類型。 -
永久訊息可以只由一個處理作業來寫入或讀取。這可避免因並行寫入和讀取而導致訊息內容不一致。使用永久訊息傳遞管道時,
DBMS_PIPE只允許一項作業,傳送訊息或接收訊息在指定時間為作用中。不過,如果因為進行中的作業而無法進行作業,則處理作業會定期重試,直到達到timeout值為止。 -
如果您使用 Oracle Cloud Infrastructure Object Storage 來儲存訊息,可以使用 Oracle Cloud Infrastructure 原生 URI 或 Swift URI。不過,位置 URI 與憑證的類型必須相符,如下所示:
-
如果您使用原生 URI 格式來存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用原生 Oracle Cloud Infrastructure 簽署金鑰認證。
-
如果您使用 Swift URI 格式存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用認證權杖認證。
-
異常狀況
表格 - RECEIVE_MESSAGE 函數異常狀況
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤。從管道移除記錄的權限不足。管線是由其他人所擁有。 |
SEND_MESSAGE 函數
此函數會在指定的管道上傳送訊息。
此訊息包含在本機訊息緩衝區中,該緩衝區已填入對 PACK_MESSAGE 的呼叫。您可以使用 CREATE_PIPE 明確地建立管,否則會以隱含方式建立管。
語法
DBMS_PIPE.SEND_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT MAXWAIT,
credential_name IN VARCHAR2 DEFAULT null,
location_uri IN VARCHAR2 )
RETURN INTEGER;
參數
表格 - SEND_MESSAGE 函數參數
| Parameter - 參數 | 描述 |
|---|---|
credential_name |
用來儲存訊息之雲端存放區的證明資料名稱。
您可以在呼叫 執行 |
location_uri |
用來儲存訊息之雲端存放區的位置 URI。
您可以在呼叫 |
maxpipesize |
允許的管道大小上限 (位元組)。 管道上所有訊息的總大小不得超過此金額。訊息若超過此上限,就會被封鎖。預設值為 65536 位元組。 管的 將 65536 的預設 |
pipename |
您要放置訊息的管道名稱。 如果您使用明確的管道,則此為您在呼叫 ** 注意:** 請勿使用以 ' |
timeout |
嘗試在管道上放置訊息時所等待的時間 (秒)。 預設值為常數 |
傳回值
表格 - SEND_MESSAGE 函數傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功。 如果管已存在,且嘗試建立管路的使用者已獲授權使用該管路,則 Oracle 會傳回 0,表示成功,且管路中已存在的任何資料都會保留。 如果以 |
1 |
已逾時。 此程序可能逾時,原因是它無法在管上取得鎖定,或是因為管路仍然太滿而無法使用。如果管是隱含建立的,而且是空的,則會移除該管。 |
3 |
發生中斷。 如果管是隱含建立的,而且是空的,則會移除該管。 |
ORA-23322 |
權限不足。 如果有相同名稱的管道存在,而且是由其他使用者所建立,則 Oracle 會發出錯誤 |
使用注意事項
-
永久訊息可以只由一個處理作業來寫入或讀取。這可避免因並行寫入和讀取而導致訊息內容不一致。使用永久訊息傳遞管道時,
DBMS_PIPE只允許一項作業,傳送訊息或接收訊息在指定時間為作用中。不過,如果因為進行中的作業而無法進行作業,則處理作業會定期重試,直到達到timeout值為止。 -
如果您使用 Oracle Cloud Infrastructure Object Storage 來儲存訊息,可以使用 Oracle Cloud Infrastructure 原生 URI 或 Swift URI。不過,位置 URI 與憑證的類型必須相符,如下所示:
-
如果您使用原生 URI 格式來存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用原生 Oracle Cloud Infrastructure 簽署金鑰認證。
-
如果您使用 Swift URI 格式存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用認證權杖認證。
-
異常狀況
表格 - SEND_MESSAGE 函數例外
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤。權限不足,無法寫入管道。此管是私密管,由其他人擁有。 |
SET_CREDENTIAL_NAME 程序
此程序會設定 credential_name 變數,當管道訊息儲存在「雲端物件存放區」時,此變數會用作預設證明資料。
語法
DBMS_PIPE.SET_CREDENTIAL_NAME (
credential_name IN VARCHAR2 );
參數
| Parameter - 參數 | 描述 |
|---|---|
credential_name |
存取雲端物件儲存的證明資料名稱。 |
用途注意事項
如果您使用 Oracle Cloud Infrastructure Object Storage 來儲存訊息,可以使用 Oracle Cloud Infrastructure 原生 URI 或 Swift URI。不過,位置 URI 與憑證的類型必須相符,如下所示:
-
如果您使用原生 URI 格式來存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用原生 Oracle Cloud Infrastructure 簽署金鑰認證。
-
如果您使用 Swift URI 格式存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用認證權杖認證。
範例
BEGIN
DBMS_PIPE.SET_CREDENTIAL_NAME(
credential_name => 'my_cred1');
END;
/
SET_LOCATION_URI 程序
此程序會設定全域 location_uri 變數。
語法
DBMS_PIPE.SET_LOCATION_URI (
location_uri IN VARCHAR2 );
Parameter - 參數
| Parameter - 參數 | 描述 |
|---|---|
location_uri |
物件或檔案 URI。URI 的格式視您使用的雲端物件儲存服務而定,如需詳細資訊,請參閱雲端物件儲存 URI 格式。 |
用途注意事項
如果您使用 Oracle Cloud Infrastructure Object Storage 來儲存訊息,可以使用 Oracle Cloud Infrastructure 原生 URI 或 Swift URI。不過,位置 URI 與憑證的類型必須相符,如下所示:
-
如果您使用原生 URI 格式來存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用原生 Oracle Cloud Infrastructure 簽署金鑰認證。
-
如果您使用 Swift URI 格式存取 Oracle Cloud Infrastructure Object Storage,則必須在證明資料物件中使用認證權杖認證。
範例
BEGIN
DBMS_PIPE.GET_LOCATION_URI(
location_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/');
END;
/