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ファンクションのパラメータ
パラメータ | 摘要 |
---|---|
|
作成するパイプの名前。
注意: |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。この最大値を超えると、そのメッセージはブロックされます。 デフォルトの パイプの デフォルトの |
|
デフォルトの パブリック・パイプは、 |
|
デフォルト値: |
|
シングルトン・パイプにキャッシュされるメッセージの失効時間を秒単位で設定します。指定された デフォルト値は |
戻り値
表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 | 成功 |
0 以外 | 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バイトになります。 パイプの
デフォルトの |
|
デフォルト値: |
|
シングルトン・パイプにキャッシュされるメッセージの失効時間を秒単位で設定します。 指定された デフォルト値は |
戻り値
表6-9 SEND_MESSAGEファンクションの戻り値
返品 | 摘要 |
---|---|
|
成功。 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。
|
|
タイムアウト。 このプロシージャは、管でロックが取得できないか、またはパイプがいっぱいで使用できない理由でタイムアウトする可能性があります。暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
割込みが発生しました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
|
既存のパイプをシングルトン・パイプに変換できませんでした。
|
|
|
|
権限が不十分です。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
例外
表6-10 SEND_MESSAGEファンクションの例外
例外 | 摘要 |
---|---|
|
権限エラーが発生しました。パイプに書込みを行うための権限が不十分です。パイプはプライベートで、別のユーザーが所有しています。 |
DBMS_PIPE永続メッセージング・パイプの概要
パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラートなど、複数の潜在的なアプリケーションがあります。
Autonomous Databaseでは、DBMS_PIPEパッケージに、永続メッセージング・パイプをサポートするための拡張機能があります。
DBMS_PIPE
の永続メッセージ:
-
非常に大きなメッセージを送信および取得する機能をサポートします。
-
多数のパイプメッセージをサポートします。
-
単一のデータベース内、複数のデータベース間、および異なるリージョン内のデータベース間でのメッセージの共有をサポートします。
-
同じクラウド・オブジェクト・ストアの場所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ファンクションのパラメータ
パラメータ | 摘要 |
---|---|
|
作成するパイプの名前。
注意: |
|
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。この最大値を超えると、そのメッセージはブロックされます。 デフォルトの パイプの デフォルトの |
|
デフォルトの パブリック・パイプは、 |
戻り値
表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;
戻り値
戻り値 | 摘要 |
---|---|
|
クラウド・オブジェクト・ストレージにアクセスするための資格証明の名前。 |
例
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バイトになります。 パイプの
デフォルトの |
|
メッセージを設定するパイプの名前。 明示的なパイプを使用している場合、この名前は、 注意: |
|
パイプにメッセージを設定する間の待機時間(秒単位)。 デフォルト値は定数 |
戻り値
表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 );
パラメータ
パラメータ | 摘要 |
---|---|
|
クラウド・オブジェクト・ストレージにアクセスするための資格証明の名前。
|
使用上のノート
メッセージの格納に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;
/