DBMS_PIPE パッケージは、同じデータベースクラスターに接続されたセッション内またはセッション間でパイプを使用してメッセージを送信する機能を提供します。

次の表に、DBMS_PIPE パッケージで使用可能な関数とストアドプロシージャを示します。

表 1. 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」 は各データ型のコードをリストします。
表 2. NEXT_ITEM_TYPE のデータ型コード
型コード データ型
0 No more data items
9 NUMBER
11 VARCHAR2
13 DATE
23 RAW
表にリストされている型コードは、Oracle データベースと互換性がありません。 Oracle は、データ型に異なる番号付けシーケンスを割り当てます。

次の例は、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 操作によって返されたステータスコード。

次の表に、可能なステータスコードを示します。

表 3. SEND_MESSAGE のステータスコード
ステータスコード 説明
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