DBMS_PIPEパッケージ
DBMS_PIPE
パッケージによって、同じインスタンスにある複数のセッションの通信を行います。
Oracle Autonomous Databaseは、Oracle Database 19cで使用可能なコアDBMS_PIPE
機能と拡張機能をサポートしています。
Oracle Databaseで提供される主要なDBMS_PIPE
機能の詳細は、DBMS_PIPEを参照してください。
- DBMS_PIPEシングルトン・パイプの概要
パイプ機能には、いくつかの潜在的なアプリケーションがあります: 外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラート。 - シングルトン・パイプのDBMS_PIPEサブプログラムの要約
この表は、DBMS_PIPE
サブプログラムとその説明を示しています。 - DBMS_PIPE永続メッセージング・パイプの概要
パイプ機能には、いくつかの潜在的なアプリケーションがあります: 外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラート。 - 永続メッセージング用のDBMS_PIPEサブプログラムの要約
この表は、DBMS_PIPE
サブプログラムとその説明を示しています。
DBMS_PIPEシングルトン・パイプの概要
パイプ機能には、いくつかの潜在的なアプリケーションがあります: 外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラート。
Autonomous Databaseでは、DBMS_PIPEパッケージに、シングルトン・パイプをサポートする拡張機能があります。
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サブプログラムの要約
この表は、DBMS_PIPE
サブプログラムを示し、簡単に説明しています。
表6-1 DBMS_PIPEパッケージ・サブプログラム
サブプログラム | 説明 |
---|---|
パイプを作成します(プライベート・パイプの場合は必須です)。 |
|
バッファにある次の項目のデータ・タイプを戻します。 |
|
ローカル・バッファにメッセージを作成します。 |
|
名前付きパイプの内容をパージします。 |
|
名前付きパイプからローカル・バッファにメッセージをコピーします。 |
|
ローカル・バッファの内容をパージします。 |
|
名前付きパイプを削除します。 |
|
メッセージを名前付きパイプに送信します。名前付きパイプが存在しない場合は、パブリック・パイプが暗黙的に作成されます。 |
|
一意のセッション名を戻します。 |
|
バッファにある次の項目にアクセスします。 |
- CREATE_PIPEファンクション
この関数は、パブリック・パイプまたはプライベート・パイプを明示的に作成します。private
フラグがTRUE
の場合、パイプ作成者がそのプライベート・パイプの所有者として割り当てられます。 - RECEIVE_MESSAGEファンクション
このファンクションは、メッセージをローカル・メッセージ・バッファにコピーします。 - SEND_MESSAGEファンクション
この関数は、名前付きパイプにメッセージを送信します。
親トピック: DBMS_PIPEパッケージ
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;
パラメータ
表6-2 CREATE_PIPEファンクション・パラメータ
パラメータ | 説明 |
---|---|
|
作成するパイプの名前。
注意: |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。 この最大値を超えると、そのメッセージはブロックされます。 デフォルトの パイプの デフォルトの65536の |
|
デフォルトの パブリック・パイプは、 |
|
デフォルト値: |
|
シングルトン・パイプにキャッシュされたメッセージの有効期限(秒)。 指定した デフォルト値は |
戻り値
表6-3 CREATE_PIPEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。 |
|
既存のパイプをシングルトン・パイプに変換できませんでした。
|
|
|
|
命名競合のために失敗。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
例外
表6-4 CREATE_PIPEファンクション例外
例外 | 説明 |
---|---|
|
アクセス権エラー: 同名のパイプが存在するため使用できません。 |
例
シェルフが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;
パラメータ
表6-5 RECEIVE_MESSAGEファンクション・パラメータ
パラメータ | 説明 |
---|---|
|
メッセージを受信するパイプ名。
|
|
メッセージを待つ時間(秒単位)。 タイムアウトを0(ゼロ)に指定すると、ブロックされずに読み込むことができます。 タイムアウトには、 デフォルト値: 定数 |
|
シングルトン・パイプにメッセージを自動的にキャッシュするためのキャッシュ機能名。 関数の名前は、所有者スキーマで完全修飾する必要があります:
デフォルト値: |
戻り値
表6-6 RECEIVE_MESSAGEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功 |
|
タイムアウトしました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
パイプにあるレコードが、バッファに対して大きすぎます。 |
|
割込みが発生しました。 |
8 |
キャッシュ機能は、シングルトン・パイプを使用する場合にのみ指定できます。 |
|
パイプから読み込むための十分な権限がユーザーにありません。 |
使用上のノート
パイプからメッセージを受信するには、最初にRECEIVE_MESSAGE
をコールします。 メッセージを受信すると、メッセージはパイプから削除されるため、メッセージは1回しか受信できません。 暗黙的に作成されたパイプは、最後のレコードがそのパイプから削除された後で削除されます。
RECEIVE_MESSAGE
のコール時に指定したパイプがすでに存在しない場合、Oracleはパイプを暗黙的に作成してメッセージの受信を待ちます。 メッセージが指定したタイムアウト時間内に着信しなかった場合、そのコールは戻され、パイプは削除されます。
メッセージの受信後、1つ以上のUNPACK_MESSAGE
をコールして、メッセージ内の個別の項目にアクセスする必要があります。 UNPACK_MESSAGE
プロシージャは、DATE
、NUMBER
、VARCHAR2
タイプの項目をアンパックするためにオーバーロードされ、さらに、RAW
およびROWID
項目をアンパックするための2つのプロシージャがあります。 アンパックするデータのタイプが不明の場合は、NEXT_ITEM_TYPE
をコールして、バッファ内にある次の項目のタイプを判別します。
キャッシュ関数パラメータ
シングルトン・パイプは、次の2つのシナリオの場合に、メッセージをパイプに自動的にキャッシュするキャッシュ機能をサポートしています:
- シングルトン・パイプが空です。
shelflife
時間が経過したため、シングルトン・パイプのメッセージが無効です。
関数の名前は、所有者スキーマで完全修飾する必要があります:
OWNER.FUNCTION_NAME
OWNER.PACKAGE.FUNCTION_NAME
キャッシュ関数を使用するには、DBMS_PIPE.RECEIVE_MESSAGE
を起動する現在のセッション・ユーザーに、キャッシュ関数を実行するために必要な権限が必要です。
キャッシュ関数の構文
CREATE OR REPLACE FUNCTION cache_function_name (
pipename IN VARCHAR2
) RETURN INTEGER;
パラメータ | データ型 | 説明 |
---|---|---|
|
VARCHAR2 |
シングルトン・パイプの名前。 |
戻る | 説明 |
---|---|
0 | 成功 |
Non-zero | DBMS_PIPE.RECEIVE_MESSAGE から返された失敗値 |
シングルトン・パイプのリーダー・セッションから複雑なカプセル化と抽象化を実現するキャッシュ機能を定義します。 キャッシュ関数内の一般的な操作は次のとおりです:
DBMS_PIPE.CREATE_PIPE
を使用して、明示的なパイプ用のシングルトン・パイプを作成します。- シングルトン・パイプにキャッシュするメッセージを作成します。
- メッセージをシングルトン・パイプに送信します。オプションで、暗黙的メッセージの
shelflife
を指定します。
例外
表6-7 RECEIVE_MESSAGEファンクションの例外
例外 | 説明 |
---|---|
|
アクセス権エラー。 パイプからレコードを削除するための権限が不十分です。 パイプは別のユーザーが所有しています。 |
例
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
パラメータをTRUE
に設定します。 次の引数をシングルトン・パイプに適用できます:
singleton
: パイプをシングルトン・パイプとして作成する必要があることを示します(デフォルト値):FALSE
).shelflife
: オプションで、シングルトン・パイプにキャッシュされたメッセージのシェルフ有効期限を指定します。 シングルトン・パイプでメッセージの暗黙的な無効化に使用できます。この引数は、暗黙的パイプおよび明示的なシングルトン・パイプに適用されます。 「SEND_MESSAGEファンクション」で指定された
shelflife
値は、「CREATE_PIPEファンクション」の明示的なシングルトン・パイプに指定されたshelflife
を上書きし、シングルトン・パイプにキャッシュされた新しいメッセージのデフォルトになります。
構文
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;
パラメータ
表6-8 SEND_MESSAGEファンクション・パラメータ
パラメータ | 説明 |
---|---|
|
メッセージを設定するパイプの名前。 明示的なパイプを使用している場合、この名前は、 注意: |
|
パイプにメッセージを設定する間の待機時間(秒単位)。 デフォルト値は定数 |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。 この最大値を超えると、そのメッセージはブロックされます。 デフォルトは65536バイトです。 パイプの
デフォルトの65536の |
|
デフォルト値: |
|
シングルトン・パイプにキャッシュされたメッセージの有効期限(秒)。 指定した デフォルト値は |
戻り値
表6-9 SEND_MESSAGEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功。 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。
|
|
タイムアウトしました。 このプロシージャは、パイプでロックが取得できないか、またはパイプがいっぱいで使用できない理由でタイムアウトできます。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
割込みが発生しました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
既存のパイプをシングルトン・パイプに変換できませんでした。
|
|
|
|
権限が不十分です。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
例外
表6-10 SEND_MESSAGEファンクション例外
例外 | 説明 |
---|---|
|
アクセス権エラー。 パイプに書込みを行うための権限が不十分です。 パイプはプライベートで、別のユーザーが所有しています。 |
DBMS_PIPE永続メッセージング・パイプの概要
パイプ機能には、いくつかの潜在的なアプリケーションがあります: 外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラート。
Autonomous Databaseでは、DBMS_PIPEパッケージに、永続メッセージ・パイプをサポートする拡張機能があります。
DBMS_PIPE
の永続メッセージ:
-
非常に大きなメッセージを送信および取得する機能をサポートします。
-
大量のパイプ・メッセージをサポートします。
-
1つのデータベース内、複数のデータベース間、および異なるリージョン内のデータベース間でのメッセージの共有をサポートします。
-
同じクラウド・オブジェクト・ストアのロケーションURIを使用して、複数のパイプをサポートします。
永続メッセージ機能を使用すると、2つ以上のデータベース・セッションが、クラウド・オブジェクト・ストアに格納されているメッセージと通信できます。 パイプ内のこの機能メッセージを使用できるのは、現在のデータベースのみか、同じリージョン内の複数のデータベースまたは異なるリージョン間で複数のデータベースで使用可能にできます。
永続メッセージング・パイプには、サポートされている
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を使用する1つのAutonomous Databaseインスタンスと、WE8MSWIN1252を使用する別のインスタンスがある場合、これら2つのデータベース間でDBMS_PIPE
を含むメッセージを送信することはできません。 この場合、これらの2つのデータベース間でDBMS_PIPE
のメッセージを送信しようとすると、エラーORA-12704
が発生します。
詳細については、「Autonomous Databaseの文字セットの選択」を参照してください。
親トピック: DBMS_PIPEパッケージ
永続メッセージング用のDBMS_PIPEサブプログラムの要約
この表は、DBMS_PIPE
サブプログラムを示し、簡単に説明しています。
表6-11 DBMS_PIPEパッケージ・サブプログラム
サブプログラム | 説明 |
---|---|
パイプを作成します(プライベート・パイプの場合は必須です)。 |
|
グローバルな |
|
メッセージがクラウド・オブジェクト・ストアに格納されるときに使用するデフォルトのロケーションURIとして使用されるグローバル |
|
バッファにある次の項目のデータ・タイプを戻します。 |
|
ローカル・バッファにメッセージを作成します。 |
|
名前付きパイプからローカル・バッファにメッセージをコピーします。 |
|
ローカル・バッファの内容をパージします。 |
|
名前付きパイプを削除します。 |
|
名前付きパイプでメッセージを送信: これにより、名前付きパイプが存在しない場合は、パブリック・パイプが暗黙的に作成されます。 |
|
クラウド・オブジェクト・ストアに格納されているメッセージのデフォルトの資格証明として使用される |
|
クラウド・オブジェクト・ストアに格納されているメッセージのデフォルトのロケーションURIとして使用されるグローバル |
|
一意のセッション名を戻します。 |
|
バッファにある次の項目にアクセスします。 |
- CREATE_PIPEファンクション
この関数は、パブリック・パイプまたはプライベート・パイプを明示的に作成します。private
フラグがTRUE
の場合、パイプ作成者がそのプライベート・パイプの所有者として割り当てられます。 - GET_CREDENTIAL_NAMEファンクション
このファンクションは、メッセージがクラウド・オブジェクト・ストアに格納されるときに使用するグローバルcredential_name
変数値を返します。 - GET_LOCATION_URIファンクション
このファンクションは、パイプ・メッセージがクラウド・オブジェクト・ストアに格納されるときにデフォルトのロケーションURIとして使用できるグローバルlocation_uri
変数値を返します。 - RECEIVE_MESSAGEファンクション
このファンクションは、メッセージをローカル・メッセージ・バッファにコピーします。 - SEND_MESSAGEファンクション
この関数は、名前付きパイプにメッセージを送信します。 - SET_CREDENTIAL_NAMEプロシージャ
このプロシージャは、パイプ・メッセージがクラウド・オブジェクト・ストアに格納されるときにデフォルトの資格証明として使用されるcredential_name
変数を設定します。 - SET_LOCATION_URIプロシージャ
このプロシージャは、グローバルlocation_uri
変数を設定します。
親トピック: DBMS_PIPEパッケージ
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;
パラメータ
表6-12 CREATE_PIPEファンクション・パラメータ
パラメータ | 説明 |
---|---|
|
作成するパイプの名前。
注意: |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。 この最大値を超えると、そのメッセージはブロックされます。 デフォルトの パイプの デフォルトの65536の |
|
デフォルトの パブリック・パイプは、 |
戻り値
表6-13 CREATE_PIPEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。 |
|
命名競合のために失敗。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
例外
表6-14 CREATE_PIPEファンクション例外
例外 | 説明 |
---|---|
|
アクセス権エラー: 同名のパイプが存在するため使用できません。 |
例
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;
戻り値
戻り値 | 説明 |
---|---|
|
Cloud Object Storageにアクセスするための資格証明の名前。 |
例
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;
パラメータ
表6-15 RECEIVE_MESSAGEファンクション・パラメータ
パラメータ | 説明 |
---|---|
|
メッセージを受信するパイプ名。
|
|
メッセージを待つ時間(秒単位)。 タイムアウトを0(ゼロ)に指定すると、ブロックされずに読み込むことができます。 タイムアウトには、 デフォルト値: 定数 |
|
メッセージの格納に使用されるクラウド・ストアの資格証明名。
この値は、 資格証明オブジェクトには、
|
|
メッセージの格納に使用されるクラウド・ストアのロケーションURI。
この値は、 |
戻り値
表6-16 RECEIVE_MESSAGEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功 |
|
タイムアウトしました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
パイプにあるレコードが、バッファに対して大きすぎます。 |
|
割込みが発生しました。 |
|
パイプから読み込むための十分な権限がユーザーにありません。 |
使用上のノート
-
パイプからメッセージを受信するには、最初に
RECEIVE_MESSAGE
をコールします。 メッセージを受信すると、メッセージはパイプから削除されるため、メッセージは1回しか受信できません。 暗黙的に作成されたパイプは、最後のレコードがそのパイプから削除された後で削除されます。 -
RECEIVE_MESSAGE
のコール時に指定したパイプがすでに存在しない場合、Oracleはパイプを暗黙的に作成してメッセージの受信を待ちます。 メッセージが指定したタイムアウト時間内に着信しなかった場合、そのコールは戻され、パイプは削除されます。 -
メッセージの受信後、1つ以上の
UNPACK_MESSAGE
をコールして、メッセージ内の個別の項目にアクセスする必要があります。UNPACK_MESSAGE
プロシージャは、DATE
、NUMBER
、VARCHAR2
タイプの項目をアンパックするためにオーバーロードされ、さらに、RAW
およびROWID
項目をアンパックするための2つのプロシージャがあります。 アンパックするデータのタイプが不明の場合は、NEXT_ITEM_TYPE
をコールして、バッファ内にある次の項目のタイプを判別します。 -
永続メッセージは、1つのプロセスによる書込みまたは読取りが保証されます。 これにより、同時書込みおよび同時読取りによるメッセージ・コンテンツの矛盾が回避されます。 永続メッセージ・パイプを使用すると、
DBMS_PIPE
は1つの操作のみを許可し、メッセージまたは受信メッセージを一度にアクティブにすることができます。 ただし、進行中の操作のために操作が不可能な場合、プロセスは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にアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。
-
例外
表6-17 RECEIVE_MESSAGEファンクションの例外
例外 | 説明 |
---|---|
|
アクセス権エラー。 パイプからレコードを削除するための権限が不十分です。 パイプは別のユーザーが所有しています。 |
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;
パラメータ
表6-18 SEND_MESSAGEファンクション・パラメータ
パラメータ | 説明 |
---|---|
credential_name |
メッセージの格納に使用されるクラウド・ストアの資格証明名。
この値は、 資格証明オブジェクトには、
|
location_uri |
メッセージの格納に使用されるクラウド・ストアのロケーションURI。
この値は、 |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。 この最大値を超えると、そのメッセージはブロックされます。 デフォルトは65536バイトです。 パイプの
デフォルトの65536の |
|
メッセージを設定するパイプの名前。 明示的なパイプを使用している場合、この名前は、 注意: |
|
パイプにメッセージを設定する間の待機時間(秒単位)。 デフォルト値は定数 |
戻り値
表6-19 SEND_MESSAGEファンクションの戻り値
戻る | 説明 |
---|---|
|
成功。 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。
|
|
タイムアウトしました。 このプロシージャは、パイプでロックが取得できないか、またはパイプがいっぱいで使用できない理由でタイムアウトできます。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
割込みが発生しました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
権限が不十分です。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
使用上のノート
-
永続メッセージは、1つのプロセスによる書込みまたは読取りが保証されます。 これにより、同時書込みおよび同時読取りによるメッセージ・コンテンツの矛盾が回避されます。 永続メッセージ・パイプを使用すると、
DBMS_PIPE
は1つの操作のみを許可し、メッセージまたは受信メッセージを一度にアクティブにすることができます。 ただし、進行中の操作のために操作が不可能な場合、プロセスは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にアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。
-
例外
表6-20 SEND_MESSAGEファンクション例外
例外 | 説明 |
---|---|
|
アクセス権エラー。 パイプに書込みを行うための権限が不十分です。 パイプはプライベートで、別のユーザーが所有しています。 |
SET_CREDENTIAL_NAMEプロシージャ
このプロシージャは、パイプ・メッセージがクラウド・オブジェクト・ストアに格納されるときにデフォルトの資格証明として使用されるcredential_name
変数を設定します。
構文
DBMS_PIPE.SET_CREDENTIAL_NAME ( credential_name IN VARCHAR2 );
パラメータ
パラメータ | 説明 |
---|---|
|
Cloud Object Storageにアクセスするための資格証明の名前。
|
使用上のノート
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 );
パラメータ
パラメータ | 説明 |
---|---|
location_uri |
オブジェクトまたはファイルURI。 URIの形式は、詳細は、「DBMS_CLOUD 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;
/