DBMS_PIPEパッケージ(永続メッセージング・パイプ)
DBMS_PIPEパッケージによって、同じインスタンスにある複数のセッションの通信を行います。
Oracle Autonomous AI Database on Dedicated Exadata Infrastructureは、Oracle Database 19cで使用可能なコアDBMS_PIPE機能と拡張機能をサポートしています。
Oracle Databaseで提供されるDBMS_PIPEのコア機能の詳細は、『Oracle Database 19c PL/SQLパッケージおよびタイプ・リファレンス』のDBMS_PIPEに関する項または『Oracle Database 26ai PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
永続メッセージング・パイプのDBMS_PIPEの概要
パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラートなど、いくつかの潜在的なアプリケーションがあります。
Autonomous AI Databaseでは、DBMS_PIPEパッケージに、永続的なメッセージング・パイプをサポートする拡張機能があります。詳細は、『Oracle Database 19c PL/SQLパッケージおよびタイプ・リファレンス』のDBMS_PIPEに関する項または『Oracle Database 26ai PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
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を使用するAutonomous AI Databaseインスタンスが1つあり、WE8MSWIN1252を使用する別のインスタンスがある場合、これらの2つのデータベース間でDBMS_PIPEを含むメッセージを送信できません。この場合、これらの2つのデータベース間でDBMS_PIPEを含むメッセージを送信しようとすると、エラーORA-12704が発生します。
永続メッセージングのDBMS_PIPEサブプログラムの要約
この表は、DBMS_PIPEサブプログラムを示し、簡単に説明しています。
| サブプログラム | 説明 |
|---|---|
| CREATE_PIPEファンクション | パイプを作成します(プライベート・パイプの場合は必須)。 |
| GET_CREDENTIAL_NAMEファンクション | グローバルなcredential_name変数値を返します。 |
| GET_LOCATION_URIファンクション | メッセージがクラウド・オブジェクト・ストアに格納されるときに使用するデフォルトの場所URIとして使用されるグローバルlocation_uri変数値を戻します。 |
| NEXT_ITEM_TYPEファンクション |
バッファにある次の項目のデータ型を戻します。 |
| PACK_MESSAGEプロシージャ |
ローカル・バッファにメッセージを生成します。 |
| RECEIVE_MESSAGEファンクション | 名前付きパイプからローカル・バッファにメッセージをコピーします。 |
| RESET_BUFFERプロシージャ |
ローカル・バッファの内容を消去します。 |
| REMOVE_PIPEファンクション |
名前付きパイプを削除します。 |
| SEND_MESSAGEファンクション | 名前付きパイプにメッセージを送信します。名前付きパイプが存在しない場合は、パブリック・パイプが暗黙的に作成されます。 |
| SET_CREDENTIAL_NAMEプロシージャ | クラウド・オブジェクト・ストアに格納されるメッセージのデフォルトの資格証明として使用されるcredential_name変数を設定します。 |
| SET_LOCATION_URIプロシージャ | クラウド・オブジェクト・ストアに格納されるメッセージのデフォルトの場所URIとして使用されるグローバルlocation_uri変数を設定します。 |
| UNIQUE_SESSION_NAMEファンクション |
一意セッション名を戻します。 |
| UNPACK_MESSAGEプロシージャ |
バッファにある次の項目にアクセスします。 |
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;
Parameters
| パラメータ | 説明 |
|---|---|
pipename |
作成するパイプの名前。
**注意:** |
maxpipesize |
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。この最大値を超えると、そのメッセージはブロックされます。 デフォルトの パイプの デフォルトの |
private |
デフォルトの パブリック・パイプは、 |
戻り値
| 戻り | 説明 |
|---|---|
0 |
成功 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。 |
ORA-23322 |
命名競合のために失敗。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、Oracleではエラー |
例外
| 例外 | 説明 |
|---|---|
Null pipe name |
アクセス権エラー: 同名のパイプが存在するため使用できません。 |
例
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;
戻り値
| 戻り値 | 説明 |
|---|---|
credential_name |
クラウド・オブジェクト・ストレージにアクセスするための資格証明の名前。 |
例
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;
Parameters
表- RECEIVE_MESSAGEファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
pipename |
メッセージを受信するパイプ名。
|
timeout |
メッセージを待つ時間(秒単位)。タイムアウトを0(ゼロ)に指定すると、ブロックされずに読み込むことができます。 タイムアウトには、 デフォルト値: 定数 |
credential_name |
メッセージの格納に使用するクラウド・ストアの資格証明名。
この値は、 資格証明オブジェクトには、 |
location_uri |
メッセージの格納に使用されるクラウド・ストアの場所URI。
この値は、 |
戻り値
表- RECEIVE_MESSAGEファンクションの戻り値
| 戻り | 説明 |
|---|---|
0 |
成功 |
1 |
タイムアウト暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
2 |
パイプにあるレコードが、バッファに対して大きすぎます。 |
3 |
割込みが発生しました。 |
ORA-23322 |
パイプから読み込むための十分な権限がユーザーにありません。 |
使用上のノート
-
パイプからメッセージを受信するには、最初に
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にアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。
-
例外
表- RECEIVE_MESSAGEファンクションの例外
| 例外 | 説明 |
|---|---|
Null pipe name |
権限エラーが発生しました。パイプからレコードを削除するための権限が不十分です。パイプは別のユーザーが所有しています。 |
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;
Parameters
表- SEND_MESSAGEファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
credential_name |
メッセージの格納に使用するクラウド・ストアの資格証明名。
この値は、 資格証明オブジェクトには、 |
location_uri |
メッセージの格納に使用されるクラウド・ストアの場所URI。
この値は、 |
maxpipesize |
パイプの最大サイズ(バイト単位)。 パイプ上のすべてのメッセージの合計サイズは、この数を超えることはできません。この最大値を超えると、そのメッセージはブロックされます。デフォルトは65536バイト。 パイプの
デフォルトの |
pipename |
メッセージを設定するパイプの名前。 明示的なパイプを使用している場合、この名前は、 **注意:** ' |
timeout |
パイプにメッセージを設定する間の待機時間(秒単位)。 デフォルト値は定数 |
戻り値
表- SEND_MESSAGEファンクションの戻り値
| 戻り | 説明 |
|---|---|
0 |
成功 パイプが存在し、パイプを作成するユーザーにそのパイプの使用が認可されている場合、Oracleは0(ゼロ)を戻して成功であることを示し、パイプ内のデータはそのまま残ります。
|
1 |
タイムアウト このプロシージャは、管でロックが取得できないか、またはパイプがいっぱいで使用できない理由でタイムアウトすることがあります。暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
3 |
割込みが発生しました。 暗黙的に作成されたパイプが空の場合、そのパイプは削除されます。 |
ORA-23322 |
権限が不十分です。 同じ名前のパイプが存在し、別のユーザーがそのパイプを作成した場合、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にアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。
-
例外
表- SEND_MESSAGEファンクションの例外
| 例外 | 説明 |
|---|---|
Null pipe name |
権限エラーが発生しました。パイプに書込みを行うための権限が不十分です。パイプはプライベートで、別のユーザーが所有しています。 |
SET_CREDENTIAL_NAMEプロシージャ
このプロシージャは、パイプ・メッセージがクラウド・オブジェクト・ストアに格納されるときに、デフォルトの資格証明として使用されるcredential_name変数を設定します。
構文
DBMS_PIPE.SET_CREDENTIAL_NAME (
credential_name IN VARCHAR2 );
Parameters
| パラメータ | 説明 |
|---|---|
credential_name |
クラウド・オブジェクト・ストレージにアクセスするための資格証明の名前。 |
使用上のノート
メッセージの格納に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のフォーマットは、使用しているクラウド・オブジェクト・ストレージ・サービスによって異なります。詳細は、クラウド・オブジェクト・ストレージの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;
/