DBMS_PIPE モジュール
DBMS_PIPE モジュールは、同じ インスタンス内のデータベースに接続されたセッション内またはセッション間のパイプを通して、メッセージを送信するための一連のルーチンを提供します。
このモジュールのスキーマは SYSIBMADM です。
DBMS_PIPE モジュールには、以下の組み込みルーチンが含まれています。
| ルーチン名 | 説明 |
|---|---|
| CREATE_PIPE 関数 | プライベートまたはパブリック・パイプを明示的に作成します。 |
| NEXT_ITEM_TYPE 関数 | 受信されたメッセージの次の項目のデータ・タイプを判別します。 |
| PACK_MESSAGE 関数 | 項目をセッションのローカル・メッセージ・バッファーに入れます。 |
| PACK_MESSAGE_RAW プロシージャー | タイプ RAW の項目をセッションのローカル・メッセージ・バッファーに入れます。 |
| PURGE プロシージャー | 指定されたパイプの受信されていないメッセージを除去します。 |
| RECEIVE_MESSAGE 関数 | 指定されたパイプからメッセージを取得します。 |
| REMOVE_PIPE 関数 | 作成されたパイプを明示的に削除します。 |
| RESET_BUFFER プロシージャー | ローカル・メッセージ・バッファーをリセットします。 |
| SEND_MESSAGE プロシージャー | 指定されたパイプにメッセージを送信します。 |
| UNIQUE_SESSION_NAME 関数 | ユニークなセッション名を戻します。 |
| UNPACK_MESSAGE プロシージャー | メッセージから次のデータ項目を取得し、これを変数に割り当て ます。 |
使用上の注意
パイプは、プロシージャー呼び出し中に暗黙的または明示的に 作成されます。 プロシージャー呼び出しに、存在しないパイプ名への参照が含まれている 場合は、暗黙的パイプ が作成されます。 例えば、「mailbox」という名前のパイプが SEND_MESSAGE プロシージャーに渡され、そのパイプがまだ存在しない場合は、 「mailbox」という名前の新しいパイプが作成されます。 CREATE_PIPE 関数を呼び出し、パイプの名前を指定することによって、明示的パイプ が 作成されます。
パイプはプライベートの場合とパブリックの場合があります。 プライベート・パイプ は、パイプを作成したユーザーのみがアクセス できます。 管理者であっても、他のユーザーが作成したプライベート・パイプには アクセスできません。 パブリック・パイプ は、DBMS_PIPE モジュールへのアクセス権限を持つすべてのユーザーがアクセスできます。 パイプのアクセス・レベルを指定する には、CREATE_PIPE 関数を使用して、private パラメーターの値を指定 します。「false」は、パイプがパブリックであることを指定します。「true」は、パイプが プライベートであることを指定します。 値を指定しない場合は、デフォルトでは、 プライベート・パイプが作成されます。 暗黙パイプはすべてパブリックです。
パイプを通してメッセージを送信 するには、PACK_MESSAGE 関数を呼び出して、現行セッションでユニークなローカル・メッセージ・バッファーに、 個別のデータ項目 (行) を書き出します。 次に、SEND_MESSAGE プロシージャーを呼び出して、パイプを通してメッセージを送信します。
メッセージを受信するには、RECEIVE_MESSAGE 関数を呼び出して、指定されたパイプからメッセージを取得します。 メッセージは、受信中のセッションのローカル・メッセージ・バッファーに書き込まれます。 次に、UNPACK_MESSAGE プロシージャーを呼び出して、ローカル・メッセージ・バッファーから次のデータ項目を取得し、指定されたプログラム変数に割り当てます。 パイプに複数のメッセージが 含まれている場合は、RECEIVE_MESSAGE 関数は、メッセージを先入れ先出し法の順序で 取得します。
それぞれのセッションは、PACK_MESSAGE 関数によって作成されたメッセージ、 および RECEIVE_MESSAGE 関数によって取得されたメッセージごとに別個のメッセージ・バッファーを 保守します。 別個のメッセージ・バッファーを使用することによって、 同じセッションでメッセージを構築し、受信することができます。 ただし、RECEIVE_MESSAGE 関数が連続して呼び出された場合、 最後の RECEIVE_MESSAGE 呼び出しからのメッセージのみが、ローカル・メッセージ・バッファーに 保持されます。
例
接続 1 で、「pipe1」という名前のパイプを作成します。 セッションのローカル・メッセージ・バッファーにメッセージを書き込み、pipe1 を通してそのメッセージを送信します。
BEGIN
DECLARE status INT;
SET status = DBMS_PIPE.CREATE_PIPE( 'pipe1' );
SET status = DBMS_PIPE.PACK_MESSAGE('message1');
SET status = DBMS_PIPE.SEND_MESSAGE( 'pipe1' );
END@
接続 2 で、メッセージを受信して解凍し、標準出力に 表示します。
SET SERVEROUTPUT ON@
BEGIN
DECLARE status INT;
DECLARE int1 INTEGER;
DECLARE date1 DATE;
DECLARE raw1 BLOB(100);
DECLARE varchar1 VARCHAR(100);
DECLARE itemType INTEGER;
SET status = DBMS_PIPE.RECEIVE_MESSAGE( 'pipe1' );
IF( status = 0 ) THEN
SET itemType = DBMS_PIPE.NEXT_ITEM_TYPE();
CASE itemType
WHEN 6 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_INT( int1 );
CALL DBMS_OUTPUT.PUT_LINE( 'int1: ' || int1 );
WHEN 9 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_CHAR( varchar1 );
CALL DBMS_OUTPUT.PUT_LINE( 'varchar1: ' || varchar1 );
WHEN 12 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_DATE( date1 );
CALL DBMS_OUTPUT.PUT_LINE( 'date1:' || date1 );
WHEN 23 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_RAW( raw1 );
CALL DBMS_OUTPUT.PUT_LINE( 'raw1: ' || VARCHAR(raw1) );
ELSE
CALL DBMS_OUTPUT.PUT_LINE( 'Unexpected value' );
END CASE;
END IF;
SET status = DBMS_PIPE.REMOVE_PIPE( 'pipe1' );
END@
この例では、以下の出力が結果として戻ります。
varchar1: message1