DBMS_PIPE パッケージは、同じデータベースクラスターに接続されたセッション内またはセッション間でパイプを使用してメッセージを送信する機能を提供します。
次の表に、DBMS_PIPE パッケージで使用可能な関数とストアドプロシージャを示します。
関数/ストアドプロシージャ | 戻り値の型 | 説明 |
---|---|---|
CREATE PIPE(pipename [, maxpipesize ] [, private ]) | INTEGER | private が "true" (デフォルト) の場合は明示的にプライベートパイプを作成し、private が "false" の場合はパブリックパイプを作成します。 |
NEXT ITEM TYPE | INTEGER | 受信したメッセージの次の項目のデータ型を決定します。 |
PACK MESSAGE(item) | N/A | 現在のセッションのローカルメッセージバッファーに項目を配置します。 |
PURGE(pipename) | N/A | 指定されたパイプから未受信のメッセージを削除します。 |
RECEIVE MESSAGE(pipename [, timeout ]) | INTEGER | 指定されたパイプからメッセージを取得します。 |
REMOVE PIPE(pipename) | INTEGER | 明示的に作成されたパイプを削除します。 |
RESET BUFFER | N/A | ローカルメッセージバッファーをリセットします。 |
SEND MESSAGE(pipename [, timeout ] [, maxpipesize ]) | INTEGER | パイプでメッセージを送信します。 |
UNIQUE SESSION NAME | VARCHAR2 | 一意のセッション名を取得します。 |
UNPACK MESSAGE(item OUT) | N/A | メッセージから次のデータ項目を取得して、型の互換性変数項目に入れます。 |
パイプは、暗黙的または明示的に分類されます。 以前に CREATE_PIPE 関数で作成されていないパイプ名を参照すると、暗黙的なパイプが作成されます。 たとえば、存在しないパイプ名を使用して SEND_MESSAGE 関数を実行すると、その名前で新しい暗黙的なパイプが作成されます。 明示的なパイプは、最初のパラメーターが指定された CREATE_PIPE 関数を使用して作成されます。 最初のパラメーターは、新しいパイプのパイプ名を指定します。
パイプは、プライベートまたはパブリックとしても分類されます。 プライベートパイプには、パイプを作成したユーザーのみがアクセスすることができます。 スーパーユーザーでも、別のユーザーが作成したプライベートパイプにはアクセスできません。 パブリックパイプには、DBMS_PIPE パッケージにアクセスできるすべてのユーザーがアクセスすることができます。
パブリックパイプを作成するには、3 番目のパラメーターを FALSE に設定して CREATE_PIPE 関数を使用する必要があります。 CREATE_PIPE 関数を使用して、3 番目のパラメーターを TRUE に設定するか、3 番目のパラメーターを省略することにより、プライベートパイプを作成することができます。 すべての暗黙的なパイプはプライベートです。
個々のデータ項目またはメッセージ行は、現在のセッションに固有のローカルメッセージバッファーに最初に作成されます。 PACK_MESSAGE ストアドプロシージャは、現在のセッションのローカルメッセージバッファーにメッセージを作成します。 SEND_MESSAGE 関数を使用して、パイプを介してメッセージを送信します。
メッセージの受信には、逆の操作が含まれます。 RECEIVE_MESSAGE 関数は、指定されたパイプからメッセージを取得するために使用されます。 メッセージは、現在のセッションのローカルメッセージバッファーに書き込まれます。 UNPACK_MESSAGE ストアドプロシージャを使用して、メッセージデータ項目をメッセージバッファーからプログラム変数に転送します。 パイプに複数のメッセージが含まれている場合、RECEIVE_MESSAGE はメッセージを先入れ先出し (FIFO) の順序で取得します。
各セッションは、PACK_MESSAGE ストアドプロシージャを使用して作成されたメッセージと、RECEIVE_MESSAGE 関数によって取得されたメッセージ用に個別のメッセージバッファーを維持します。 メッセージは、同じセッションで作成および受信することができます。 ただし、連続した RECEIVE_MESSAGE 呼び出しが行われる場合、最後の RECEIVE_MESSAGE 呼び出しからのメッセージのみがローカルメッセージバッファーに保存されます。
CREATE_PIPE
CREATE_PIPE 関数は、明示的なパブリックパイプまたは指定した名前の明示的なプライベートパイプを作成します。
status INTEGER CREATE_PIPE(pipename VARCHAR2
[, maxpipesize INTEGER ] [, private BOOLEAN ])
パラメーター
パラメーター | 説明 |
---|---|
pipename | パイプの名前。 |
maxpipesize | パイプの最大容量。 単位はバイト、 デフォルト値は 8192 です。 |
private | パブリックパイプを作成するには、このパラメーターを FALSE に設定する必要があります。 プライベートパイプを作成するには、このパラメーターを TRUE に設定する必要があります。 デフォルト値は TRUE です。 |
status | 操作によって返されたステータスコード。 0 は作成が成功したことを示します。 |
例
次の例では、messages という名前のプライベートパイプを作成します。
DECLARE
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.CREATE_PIPE('messages');
DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status: ' || v_status);
END;
CREATE_PIPE status: 0
次の例では、mailbox という名前のパブリックパイプラインを作成します。
DECLARE
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.CREATE_PIPE('mailbox',8192,FALSE);
DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status: ' || v_status);
END;
CREATE_PIPE status: 0
NEXT_ITEM_TYPE
NEXT_ITEM_TYPE 関数は、現在のセッションのローカルメッセージバッファーに取得されたメッセージ内の次のデータ項目のデータ型を識別する整数コードを返します。 UNPACK_MESSAGE ストアドプロシージャによってローカルメッセージバッファーから項目が削除された場合、NEXT_ITEM_TYPE 関数は次に使用可能な項目のデータ型コードを返します。 メッセージにそれ以上項目が存在しない場合には、コード 0 が返されます。
typecode INTEGER NEXT_ITEM_TYPE
パラメーター
パラメーター | 説明 |
---|---|
typecode | 次のデータ項目のデータ型を識別するコード。 「表 2」 は各データ型のコードをリストします。 |
型コード | データ型 |
---|---|
0 | No more data items |
9 | NUMBER |
11 | VARCHAR2 |
13 | DATE |
23 | RAW |
次の例は、NUMBER 項目、VARCHAR2 項目、DATE 項目、および RAW 項目をパックしたパイプを示しています。 次に、2 番目の匿名ブロックが NEXT_ITEM_TYPE 関数を使用して、各項目の型コードを表示します。
DECLARE
v_number NUMBER := 123;
v_varchar VARCHAR2(20) := 'Character data';
v_date DATE := SYSDATE;
v_raw RAW(4) := '21222324';
v_status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(v_number);
DBMS_PIPE.PACK_MESSAGE(v_varchar);
DBMS_PIPE.PACK_MESSAGE(v_date);
DBMS_PIPE.PACK_MESSAGE(v_raw);
v_status := DBMS_PIPE.SEND_MESSAGE('datatypes');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
SEND_MESSAGE status: 0
DECLARE
v_number NUMBER;
v_varchar VARCHAR2(20);
v_date DATE;
v_timestamp TIMESTAMP;
v_raw RAW(4);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('datatypes');
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
DBMS_OUTPUT.PUT_LINE('----------------------------------');
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_number);
DBMS_OUTPUT.PUT_LINE('NUMBER Item : ' || v_number);
DBMS_OUTPUT.PUT_LINE('----------------------------------');
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_varchar);
DBMS_OUTPUT.PUT_LINE('VARCHAR2 Item : ' || v_varchar);
DBMS_OUTPUT.PUT_LINE('----------------------------------');
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_date);
DBMS_OUTPUT.PUT_LINE('DATE Item : ' || v_date);
DBMS_OUTPUT.PUT_LINE('----------------------------------');
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_raw);
DBMS_OUTPUT.PUT_LINE('RAW Item : ' || v_raw);
DBMS_OUTPUT.PUT_LINE('----------------------------------');
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE: ' || v_status);
DBMS_OUTPUT.PUT_LINE('---------------------------------');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
RECEIVE_MESSAGE status: 0
----------------------------------
NEXT_ITEM_TYPE: 9
NUMBER Item : 123
----------------------------------
NEXT_ITEM_TYPE: 11
VARCHAR2 Item : Character data
----------------------------------
NEXT_ITEM_TYPE: 13
DATE Item : 02-OCT-07 11:11:43
----------------------------------
NEXT_ITEM_TYPE: 23
RAW Item : 21222324
----------------------------------
NEXT_ITEM_TYPE: 0
PACK_MESSAGE
PACK_MESSAGE ストアドプロシージャは、データの項目を現在のセッションのローカルメッセージバッファーに配置します。 SEND_MESSAGE 呼び出しを発行する前に、少なくとも 1 回は PACK_MESSAGE ストアドプロシージャを呼び出す必要があります。
PACK_MESSAGE(item { DATE | NUMBER | VARCHAR2 | RAW })
RECEIVE_MESSAGE 呼び出しを発行してメッセージを取得した後、UNPACK_MESSAGE ストアドプロシージャを使用してデータ項目を取得することができます。
パラメーター
パラメーター | 説明 |
---|---|
item | 受け入れ可能なパラメーターのデータ型を計算するために使用される式。 計算された値は、セッションのローカルメッセージバッファーに追加されます。 |
PURGE
PURGE ストアドプロシージャは、指定された暗黙のパイプから未受信のメッセージを削除します。
PURGE(pipename VARCHAR2)
REMOVE_PIPE 関数を使用して、明示的なパイプを削除することができます。
パラメーター
パラメーター | 説明 |
---|---|
pipename | パイプの名前。 |
例
2 つのメッセージがパイプで送信されます。
DECLARE
v_status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE('Message #1');
v_status := DBMS_PIPE.SEND_MESSAGE('pipe');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
DBMS_PIPE.PACK_MESSAGE('Message #2');
v_status := DBMS_PIPE.SEND_MESSAGE('pipe');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
END;
SEND_MESSAGE status: 0
SEND_MESSAGE status: 0
最初のメッセージを受信して解凍します。
DECLARE
v_item VARCHAR2(80);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('pipe',1);
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_item);
DBMS_OUTPUT.PUT_LINE('Item: ' || v_item);
END;
RECEIVE_MESSAGE status: 0
Item: Message #1
パイプをパージします。
EXEC DBMS_PIPE.PURGE('pipe');
以下のコード例は、次のメッセージを取得する試みを示しています。 RECEIVE_MESSAGE 呼び出しはステータスコード 1 を返します。これは、使用可能なメッセージがないためにタイムアウトが生じたことを示します。
DECLARE
v_item VARCHAR2(80);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('pipe',1);
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
END;
RECEIVE_MESSAGE status: 1
RECEIVE_MESSAGE
RECEIVE_MESSAGE 関数は、指定されたパイプからメッセージを取得します。
status INTEGER RECEIVE_MESSAGE(pipename VARCHAR2
[, timeout INTEGER ])
パラメーター
pipename
パイプの名前。
timeout
タイムアウト期間。 単位は秒、 デフォルト値は 86400000 (1000 日) です。
Status
操作によって返されたステータスコード。
ステータスコード | 説明 |
---|---|
0 | 操作は成功しました。 |
1 | タイムアウトが生じます。 |
2 | メッセージがバッファーに対して大きすぎます。 |
REMOVE_PIPE
REMOVE_PIPE 関数は、明示的なプライベートパイプまたは明示的なパブリックパイプを削除します。
status INTEGER REMOVE_PIPE(pipename VARCHAR2)
CREATE_PIPE 関数を使用して作成されたパイプなどの明示的なパイプを REMOVE_PIPE 関数を使用して削除することができます。
パラメーター
パラメーター | 説明 |
---|---|
pipename | パイプの名前。 |
status | 操作によって返されたステータスコード。 指定されたパイプが存在しない場合でも、ステータスコード 0 が返されます。 |
例
2 つのメッセージがパイプで送信されます。
DECLARE
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.CREATE_PIPE('pipe');
DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status : ' || v_status);
DBMS_PIPE.PACK_MESSAGE('Message #1');
v_status := DBMS_PIPE.SEND_MESSAGE('pipe');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
DBMS_PIPE.PACK_MESSAGE('Message #2');
v_status := DBMS_PIPE.SEND_MESSAGE('pipe');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
END;
CREATE_PIPE status : 0
SEND_MESSAGE status: 0
SEND_MESSAGE status: 0
最初のメッセージを受信して解凍します。
DECLARE
v_item VARCHAR2(80);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('pipe',1);
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_item);
DBMS_OUTPUT.PUT_LINE('Item: ' || v_item);
END;
RECEIVE_MESSAGE status: 0
Item: Message #1
パイプを削除します。
SELECT DBMS_PIPE.REMOVE_PIPE('pipe') FROM DUAL;
remove_pipe
-------------
0
(1 row)
次のコード例は、次のメッセージを取得する試みを示しています。 RECEIVE_MESSAGE 呼び出しは、パイプが削除されたためにタイムアウトが生じたことを示すステータスコード 1 を返します。
DECLARE
v_item VARCHAR2(80);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('pipe',1);
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
END;
RECEIVE_MESSAGE status: 1
RESET_BUFFER
RESET_BUFFER ストアドプロシージャは、ローカルメッセージバッファーへのポインターをバッファーの先頭にリセットします。 これにより、後続の PACK_MESSAGE 呼び出しで RESET_BUFFER 呼び出しの前にメッセージバッファーに存在していたデータ項目が上書きされます。
RESET_BUFFER
例
John へのメッセージは、ローカルメッセージバッファーに書き込まれます。 RESET_BUFFER ストアドプロシージャを呼び出して、このメッセージをボブへのメッセージに置き換えることができます。 ボブへのメッセージはパイプで送信されます。
DECLARE
v_status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE('Hi, John');
DBMS_PIPE.PACK_MESSAGE('Can you attend a meeting at 3:00, today?') ;
DBMS_PIPE.PACK_MESSAGE('If not, is tomorrow at 8:30 ok with you?') ;
DBMS_PIPE.RESET_BUFFER;
DBMS_PIPE.PACK_MESSAGE('Hi, Bob');
DBMS_PIPE.PACK_MESSAGE('Can you attend a meeting at 9:30, tomorrow?') ;
v_status := DBMS_PIPE.SEND_MESSAGE('pipe');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status: ' || v_status);
END;
SEND_MESSAGE status: 0
受信したメッセージにボブへのメッセージが表示されます。
DECLARE
v_item VARCHAR2(80);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE('pipe',1);
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status: ' || v_status);
DBMS_PIPE.UNPACK_MESSAGE(v_item);
DBMS_OUTPUT.PUT_LINE('Item: ' || v_item);
DBMS_PIPE.UNPACK_MESSAGE(v_item);
DBMS_OUTPUT.PUT_LINE('Item: ' || v_item);
END;
RECEIVE_MESSAGE status: 0
Item: Hi, Bob
Item: Can you attend a meeting at 9:30, tomorrow?
SEND_MESSAGE
SEND_MESSAGE 関数は、ローカルメッセージバッファーから指定されたパイプにメッセージを送信します。
status SEND_MESSAGE(pipename VARCHAR2 [, timeout INTEGER ]
[, maxpipesize INTEGER ])
パラメーター
パラメーター | 説明 |
---|---|
pipename | パイプの名前。 |
timeout | タイムアウト期間。 単位は秒、 デフォルト値は 86400000 (1000 日) です。 |
maxpipesize | パイプの最大容量。 単位はバイト、 デフォルト値は 8192 バイトです。 |
Status | 操作によって返されたステータスコード。 |
次の表に、可能なステータスコードを示します。
ステータスコード | 説明 |
---|---|
0 | 操作は成功しました。 |
1 | タイムアウトが生じます。 |
3 | 関数は中断されます。 |
UNIQUE_SESSION_NAME
UNIQUE_SESSION_NAME 関数は、現在のセッションに固有の名前を返します。
name VARCHAR2 UNIQUE_SESSION_NAME
パラメーター
パラメーター | 説明 |
---|---|
name | 一意のセッション名。 |
例
次の匿名ブロックは、一意のセッション名を取得して表示します。
DECLARE
v_session VARCHAR2(30);
BEGIN
v_session := DBMS_PIPE.UNIQUE_SESSION_NAME;
DBMS_OUTPUT.PUT_LINE('Session Name: ' || v_session);
END;
Session Name: PG$PIPE$5$2752
UNPACK_MESSAGE
UNPACK_MESSAGE ストアドプロシージャは、メッセージのデータ項目をローカルメッセージバッファーから指定されたプログラム変数にコピーします。 UNPACK_MESSAGE ストアドプロシージャを使用する前に、RECEIVE_MESSAGE 関数を使用して、メッセージをローカルメッセージバッファーに入れる必要があります。
UNPACK_MESSAGE(item OUT { DATE | NUMBER | VARCHAR2 | RAW })
パラメーター
パラメーター | 説明 |
---|---|
item | ローカルメッセージバッファーからデータ項目を受け取る変数。 この変数は、データ項目の型と互換性がある必要があります。 |
包括的な例
次の例では、パイプを「メールボックス」として使用しています。 一連のストアドプロシージャを使用して、メールボックスを作成し、メールボックスにマルチアイテムメッセージ (最大 3 つの項目) を追加し、メールボックスのすべてのコンテンツを表示します。 これらのストアドプロシージャは、mailbox という名前のパッケージに含まれています。
CREATE OR REPLACE PACKAGE mailbox
IS
PROCEDURE create_mailbox;
PROCEDURE add_message (
p_mailbox VARCHAR2,
p_item_1 VARCHAR2,
p_item_2 VARCHAR2 DEFAULT 'END',
p_item_3 VARCHAR2 DEFAULT 'END'
);
PROCEDURE empty_mailbox (
p_mailbox VARCHAR2,
p_waittime INTEGER DEFAULT 10
);
END mailbox;
CREATE OR REPLACE PACKAGE BODY mailbox
IS
PROCEDURE create_mailbox
IS
v_mailbox VARCHAR2(30);
v_status INTEGER;
BEGIN
v_mailbox := DBMS_PIPE.UNIQUE_SESSION_NAME;
v_status := DBMS_PIPE.CREATE_PIPE(v_mailbox,1000,FALSE);
IF v_status = 0 THEN
DBMS_OUTPUT.PUT_LINE('Created mailbox: ' || v_mailbox);
ELSE
DBMS_OUTPUT.PUT_LINE('CREATE_PIPE failed - status: ' ||
v_status);
END IF;
END create_mailbox;
PROCEDURE add_message (
p_mailbox VARCHAR2,
p_item_1 VARCHAR2,
p_item_2 VARCHAR2 DEFAULT 'END',
p_item_3 VARCHAR2 DEFAULT 'END'
)
IS
v_item_cnt INTEGER := 0;
v_status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(p_item_1);
v_item_cnt := 1;
IF p_item_2 ! = 'END' THEN
DBMS_PIPE.PACK_MESSAGE(p_item_2);
v_item_cnt := v_item_cnt + 1;
END IF;
IF p_item_3 ! = 'END' THEN
DBMS_PIPE.PACK_MESSAGE(p_item_3);
v_item_cnt := v_item_cnt + 1;
END IF;
v_status := DBMS_PIPE.SEND_MESSAGE(p_mailbox);
IF v_status = 0 THEN
DBMS_OUTPUT.PUT_LINE('Added message with ' || v_item_cnt ||
' item(s) to mailbox ' || p_mailbox);
ELSE
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE in add_message failed - ' ||
'status: ' || v_status);
END IF;
END add_message;
PROCEDURE empty_mailbox (
p_mailbox VARCHAR2,
p_waittime INTEGER DEFAULT 10
)
IS
v_msgno INTEGER DEFAULT 0;
v_itemno INTEGER DEFAULT 0;
v_item VARCHAR2(100);
v_status INTEGER;
BEGIN
v_status := DBMS_PIPE.RECEIVE_MESSAGE(p_mailbox,p_waittime);
WHILE v_status = 0 LOOP
v_msgno := v_msgno + 1;
DBMS_OUTPUT.PUT_LINE('****** Start message #' || v_msgno ||
' ******');
BEGIN
LOOP
v_status := DBMS_PIPE.NEXT_ITEM_TYPE;
EXIT WHEN v_status = 0;
DBMS_PIPE.UNPACK_MESSAGE(v_item);
v_itemno := v_itemno + 1;
DBMS_OUTPUT.PUT_LINE('Item #' || v_itemno || ': ' ||
v_item);
END LOOP;
DBMS_OUTPUT.PUT_LINE('******* End message #' || v_msgno ||
' *******');
DBMS_OUTPUT.PUT_LINE('*');
v_itemno := 0;
v_status := DBMS_PIPE.RECEIVE_MESSAGE(p_mailbox,1);
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Number of messages received: ' || v_msgno);
v_status := DBMS_PIPE.REMOVE_PIPE(p_mailbox);
IF v_status = 0 THEN
DBMS_OUTPUT.PUT_LINE('Deleted mailbox ' || p_mailbox);
ELSE
DBMS_OUTPUT.PUT_LINE('Could not delete mailbox - status: '
|| v_status);
END IF;
END empty_mailbox;
END mailbox;
次の例は、メールボックス内のストアドプロシージャの実行を示しています。 最初のストアドプロシージャは、UNIQUE_SESSION_NAME 関数によって生成された名前でパブリックパイプを作成します。
EXEC mailbox.create_mailbox;
Created mailbox: PG$PIPE$13$3940
メールボックス名を使用することにより、メールボックスと DBMS_PIPE パッケージへのアクセス権を持つ同じデータベース内のユーザーがメッセージを追加することができます。
EXEC mailbox.add_message('PG$PIPE$13$3940','Hi, John','Can you attend a meeting at 3:00, today?','-- Mary');
Added message with 3 item(s) to mailbox PG$PIPE$13$3940
EXEC mailbox.add_message('PG$PIPE$13$3940','Don''t forget to submit your report','Thanks,','-- Joe');
Added message with 3 item(s) to mailbox PG$PIPE$13$3940
メールボックスの内容は空にすることができます。
EXEC mailbox.empty_mailbox('PG$PIPE$13$3940');
****** Start message #1 ******
Item #1: Hi, John
Item #2: Can you attend a meeting at 3:00, today?
Item #3: -- Mary
******* End message #1 *******
*
****** Start message #2 ******
Item #1: Don't forget to submit your report
Item #2: Thanks,
Item #3: Joe
******* End message #2 *******
*
Number of messages received: 2
Deleted mailbox PG$PIPE$13$3940