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 中的單一管道功能提供下列各項:
-
在 Oracle 資料庫記憶體中快取和擷取最多 32,767 個位元組的自訂訊息。訊息大小上限為 32,767 個位元組,適用於所有管道,包括單一管道。先前版本的
DBMS_PIPE訊息大小上限較小。 -
使用並行讀取方式,在多個資料庫階段作業之間共用快取的訊息。
-
快取無效化方法:
-
由使用者控制的明確快取無效驗證。
-
在使用者指定的參數 (
shelflife) 時間間隔 (秒) 之後進行快取無效驗證。
-
-
宣告式且易於使用的 PL/SQL API 進行快取。
-
支援唯讀和讀寫資料庫。
「單一管線」可以是任何一種支援的 DBMS_PIPE 類型:
-
隱含管:使用
DBMS_PIPE.SEND_MESSAGE函數以不明的管路名稱傳送訊息時,會自動建立。 -
明確管線:使用
DBMS_PIPE.CREATE_PIPE函數與使用者指定的管線名稱建立。 -
公用管線:任何具備
DBMS_PIPE套裝程式之EXECUTE權限的使用者都可以存取 -
專用管線:具有與管線建立者相同之使用者的階段作業可以存取。
單一管路的 DBMS_PIPE 子程式摘要
此表格列出 DBMS_PIPE 子程式,並簡短說明它們。
| 子程式 | 描述 |
|---|---|
| CREATE_PIPE 函數 | 建立管 (專用管需要) |
| NEXT_ITEM_TYPE 函數 |
傳回緩衝區中下一個項目的資料型態 |
| PACK_MESSAGE 程序 |
在本地端緩衝區內編譯訊息 |
| 採購程序 |
清除已命名管道的內容 |
| RECEIVE_MESSAGE 函數 | 將已命名管道的訊息複製到本機緩衝區 |
| RESET_BUFFER 程序 |
清除本機緩衝區的內容 |
| REMOVE_PIPE 函數 |
移除已命名管道 |
| SEND_MESSAGE 函數 | 在具名管道上傳送訊息:如果具名管道不存在,這會以隱含方式建立公用管道 |
| UNIQUE_SESSION_NAME 函數 |
傳回唯一的階段作業名稱 |
| UNPACK_MESSAGE 程序 |
存取緩衝區中的下一個項目 |
CREATE_PIPE 函數
此函數會明確地建立公用或專用管道。如果 private 旗標為 TRUE,則會將管道建立者指派為專用管道的擁有者。
明確建立的管線只能透過呼叫 REMOVE_PIPE 或關閉執行處理來移除。
若要建立單一管線,請將 singleton 參數設為 TRUE。下列引數適用於「單一管道」:
-
singleton:表示應該將管道建立為單一管道 (預設值:FALSE)。 -
shelflife:選擇性地在「單一管線」中指定快取訊息的儲存期限過期 (秒)。它可以用於「單一管線」中訊息的隱含無效驗證。當您傳送訊息時,也可以指定「單一管道」中的訊息
shelflife(請參閱 SEND_MESSAGE 函數 )。
語法
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 - 參數 | 描述 |
|---|---|
pipename |
您正在建立的管的名稱。 當您呼叫 注意:請勿使用以 |
maxpipesize |
允許的管道大小上限 (位元組)。 管道上所有訊息的總大小不得超過此金額。訊息若超過此上限,就會被封鎖。 預設的 管的 65536 的預設 |
private |
使用預設值 當您呼叫 |
singleton |
使用 預設值: |
shelflife |
以「單一管線」快取之訊息的到期時間 (秒)。超過指定的 預設值為 |
傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功。 如果管已存在,且嘗試建立管路的使用者已獲授權使用該管路,則 Oracle 會傳回 0,表示成功,且管路中已存在的任何資料都會保留。 |
6 |
無法將現有管道轉換為單一管道。
|
7 |
提供給 shelflife 參數的非零值,且管道不是單一管道。 |
ORA-23322 |
命名衝突導致失敗。 如果有相同名稱的管道存在,而且是由其他使用者所建立,則 Oracle 會發出錯誤 |
異常狀況
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤:已經有相同名稱的管線存在,不允許使用。 |
範例
建立一個裝滿 1 小時的單一管道。
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(pipename => 'MY_PIPE1',
private => TRUE,
singleton => TRUE,
shelflife => 3600);
END;
/
RECEIVE_MESSAGE 函數
此功能會將訊息複製到本機訊息緩衝區。
語法
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT maxwait,
cache_func IN VARCHAR2 DEFAULT NULL)
RETURN INTEGER;
參數
表格 - RECEIVE_MESSAGE 函數參數
| Parameter - 參數 | 描述 |
|---|---|
pipename |
您要接收訊息的管道名稱。 以 |
timeout |
等待訊息的時間 (秒)。逾時為 0 表示不被封鎖。 逾時不包含用於 預設值:常數 |
cache_func |
自動快取單一管線中訊息的快取函數名稱。 函數的名稱應該與擁有者綱要完全合格:
預設值: |
傳回值
表格 - RECEIVE_MESSAGE 函數傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功 |
1 |
已逾時。如果管是隱含建立的,而且是空的,則會移除該管。 |
2 |
管線中的記錄對緩衝區而言太大。 |
3 |
發生中斷。 |
8 |
只有在使用單一管線時,才能指定快取函數。 |
ORA-23322 |
使用者的權限不足,無法從管道讀取。 |
使用注意事項
-
若要從管道接收訊息,請先呼叫
RECEIVE_MESSAGE。當您收到訊息時,該訊息會從管道中移除;因此,訊息只能接收一次。對於隱含建立的管,在從管中移除最後一筆記錄後,管就會被移除。 -
如果您在呼叫
RECEIVE_MESSAGE時指定的管道不存在,則 Oracle 會以隱含方式建立管道並等待接收訊息。如果訊息未在指定的逾時間隔內到達,則會傳回呼叫並移除管道。 -
在收到訊息後,您必須撥打一或多次
UNPACK_MESSAGE來存取訊息中的個別項目。UNPACK_MESSAGE程序已超載以解壓縮類型為DATE、NUMBER、VARCHAR2的項目,另外還有兩個程序可解壓縮RAW和ROWID項目。如果您不知道嘗試解壓縮的資料類型,請呼叫NEXT_ITEM_TYPE來決定緩衝區中下一個項目的類型。
快取函數參數
Singleton Pipes 支援快取功能,以在下列兩種情況下自動快取管中的訊息:
-
「單一管道」空白。
-
Singleton 管線中的訊息無效,因為經歷時間為
shelflife。
函數的名稱應該與擁有者綱要完全合格:
-
OWNER.FUNCTION_NAME -
OWNER.PACKAGE.FUNCTION_NAME
若要使用快取功能,呼叫 DBMS_PIPE.RECEIVE_MESSAGE 的目前階段作業使用者必須具有執行快取功能的必要權限。
快取函數語法
CREATE OR REPLACE FUNCTION *cache_function_name* (
pipename IN VARCHAR2
) RETURN INTEGER;
| Parameter - 參數 | 資料類型 | 描述 |
|---|---|---|
pipename |
VARCHAR2 |
單一管線的名稱。 |
| 傳回 | 描述 |
|---|---|
| 0 | 成功 |
| 非零 | DBMS_PIPE.RECEIVE_MESSAGE 傳回的失敗值 |
定義快取函數,以提供單一管路讀取器階段作業的複雜性封裝和抽象。快取函數中的典型作業如下:
-
使用
DBMS_PIPE.CREATE_PIPE建立「明確管線」的「單一管線」。 -
在「單一管線」中建立要快取的訊息。
-
傳送訊息至單一管線,選擇性地指定隱含訊息的
shelflife。
異常狀況
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤。從管道移除記錄的權限不足。管線是由其他人所擁有。 |
範例
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 函數
此函數會在指定的管道上傳送訊息。
此訊息包含在本機訊息緩衝區中,該緩衝區已填入對 PACK_MESSAGE 的呼叫。您可以使用 CREATE_PIPE 明確地建立管,否則會以隱含方式建立管。
若要建立隱含的 Singleton 管道,請將 singleton 參數設為 TRUE。下列引數適用於「單一管道」:
-
singleton:表示應該將管道建立為單一管道 (預設值:FALSE)。 -
shelflife:選擇性地在「單一管線」中指定快取訊息的儲存壽命到期。它可以用於「單一管線」中訊息的隱含無效驗證。此引數適用於隱含和明確的 Singleton 管線。SEND_MESSAGE 函數中指定的
shelflife值會覆寫為「明確單一管路」指定的shelflife
CREATE_PIPE 函數,將會是「單一管線」中快取之所有新訊息的預設值。
語法
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;
參數
表格 - SEND_MESSAGE 函數參數
| Parameter - 參數 | 描述 |
|---|---|
pipename |
您要放置訊息的管道名稱。 如果您使用明確的管道,則此為您在呼叫 ** 注意:** 請勿使用以 ' |
timeout |
嘗試在管道上放置訊息時所等待的時間 (秒)。 預設值為常數 |
maxpipesize |
允許的管道大小上限 (位元組)。 管道上所有訊息的總大小不得超過此金額。訊息若超過此上限,就會被封鎖。預設值為 65536 位元組。 管的 將 65536 的預設 |
singleton |
使用 預設值: |
shelflife |
以「單一管線」快取之訊息的到期時間 (秒)。 超過指定的 預設值為 |
傳回值
| 傳回 | 描述 |
|---|---|
0 |
成功。 如果管已存在,且嘗試建立管路的使用者已獲授權使用該管路,則 Oracle 會傳回 0,表示成功,且管路中已存在的任何資料都會保留。 如果以 |
1 |
已逾時。 此程序可能逾時,原因是它無法在管上取得鎖定,或是因為管路仍然太滿而無法使用。如果管是隱含建立的,而且是空的,則會移除該管。 |
3 |
發生中斷。 如果管是隱含建立的,而且是空的,則會移除該管。 |
6 |
無法將現有管道轉換為單一管道。
|
7 |
提供給 shelflife 參數的非零值,且管道不是單一管道。 |
ORA-23322 |
權限不足。 如果有相同名稱的管道存在,而且是由其他使用者所建立,則 Oracle 會發出錯誤 |
異常狀況
| 例外 | 描述 |
|---|---|
Null pipe name |
權限錯誤。權限不足,無法寫入管道。此管是私密管,由其他人擁有。 |