DBMS_PIPEパッケージ

DBMS_PIPEパッケージを使用すると、同じインスタンス内の2つ以上のセッションが通信できます。

Oracle Autonomous AI Databaseは、Oracle Database 19cで使用可能なコアDBMS_PIPE機能と拡張機能をサポートしています。

Oracle Databaseで提供されるコアDBMS_PIPE機能の詳細は、DBMS_PIPEを参照してください。

DBMS_PIPEシングルトン・パイプの概要

パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラートなど、複数の潜在的なアプリケーションがあります。

自律型AIデータベースでは、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サブプログラムを示し、簡単に説明しています。

表6-1 DBMS_PIPEパッケージのサブプログラム

サブプログラム 摘要

CREATE_PIPEファンクション

パイプを作成します(プライベートパイプに必要)

NEXT_ITEM_TYPEファンクション

バッファ内の次の項目のデータ型を返します

PACK_MESSAGEプロシージャ

ローカル・バッファにメッセージを作成します。

PURGEプロシージャ

名前付きパイプの内容をパージします

RECEIVE_MESSAGEファンクション

名前付きパイプからローカルバッファーにメッセージをコピーします

RESET_BUFFERプロシージャ

ローカル・バッファの内容のパージ

REMOVE_PIPEファンクション

名前付きパイプを削除します。

SEND_MESSAGEファンクション

名前付きパイプにメッセージを送信: 名前付きパイプが存在しない場合、パブリックパイプが暗黙的に作成されます。

UNIQUE_SESSION_NAMEファンクション

一意のセッション名を返します

UNPACK_MESSAGEプロシージャ

バッファ内の次の項目にアクセスします。

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ファンクションのパラメータ

パラメータ 摘要

pipename

作成するパイプの名前。

SEND_MESSAGEおよびRECEIVE_MESSAGEをコールする場合は、この名前を使用する必要があります。この名前はインスタンス全体で一意である必要があります。

注意: ORA$で始まるパイプ名は使用しないでください。これらは、Oracleが提供するプロシージャで使用するために予約されています。パイプ名は128バイトより長くしないでください。大/小文字は区別されません。現時点では、名前にグローバリゼーション・サポート文字を含めることはできません。

maxpipesize

パイプに許可される最大サイズ(バイト単位)。

パイプ上のすべてのメッセージの合計サイズがこの量を超えることはできません。この最大値を超えると、メッセージはブロックされます。

デフォルトのmaxpipesizeは66536バイトです。

パイプのmaxpipesizeは、パイプの特性の一部となり、パイプの存続期間中保持されます。値が大きいSEND_MESSAGEのコール元は、maxpipesizeを増やします。値が小さい発信者は、既存の大きい値を使用します。

デフォルトのmaxpipesizeである65536は、すべてのパイプに適用できます。

private

デフォルトのTRUEを使用して、プライベート・パイプを作成します。

パブリック・パイプは、SEND_MESSAGEをコールするときに暗黙的に作成できます。

singleton

TRUEを使用して、シングルトン・パイプを作成します。

デフォルト値: FALSE

shelflife

シングルトンパイプにキャッシュされたメッセージの有効期限(秒)。指定されたshelflife時間を超えると、メッセージはパイプからアクセスできなくなります。パラメータshelflifeは、シングルトン・パイプにのみ適用されます。

デフォルト値は0で、メッセージが失効しないことを意味します。

戻り値

表6-3 CREATE_PIPEファンクションの戻り値

返品 摘要

0

成功しました。

パイプがすでに存在し、作成しようとしているユーザーがパイプの使用を承認されている場合、Oracleは成功を示す0を返し、パイプにすでに存在するデータは残ります。

6

既存のパイプをシングルトンパイプに変換できませんでした。

  • 複数の既存のメッセージを含む暗黙的パイプは、シングルトンパイプに変換できません。
  • シングルトンではない明示的なパイプの場合、DBMS_PIPE.SEND_MESSAGEはシングルトン引数がTRUEに設定されているメッセージを送信できません。

7

shelflifeパラメータに0以外の値が指定され、パイプはシングルトン・パイプではありません。

ORA-23322

名前の競合が原因で失敗しました。

同じ名前のパイプが存在し、別のユーザーによって作成された場合、OracleはエラーORA-23322を示し、ネーミング競合を示します。

例外

表6-4 CREATE_PIPEファンクションの例外

例外 摘要

Null pipe name

権限エラー: 同じ名前のパイプがすでに存在するため、使用できません。

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ファンクションのパラメータ

パラメータ 摘要

pipename

メッセージを受信するパイプの名前。

ORA$で始まる名前は、Oracleで使用するために予約されています。

timeout

メッセージを待機する時間(秒)。タイムアウト0を指定すると、ブロックせずに読み込むことができます。

タイムアウトには、cache_funcパラメータで指定された実行キャッシュ関数に費やされた時間は含まれません。

デフォルト値: 定数MAXWAITで、86400000 (1000日)として定義されます。

cache_func

シングルトン・パイプにメッセージを自動的にキャッシュするファンクション名をキャッシュします。

ファンクションの名前は、所有者スキーマで完全修飾する必要があります。

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

デフォルト値: NULL

戻り値

表6-6 RECEIVE_MESSAGEファンクションの戻り値

返品 摘要

0

成功

1

タイムアウト。パイプが暗黙的に作成され、空の場合は削除されます。

2

パイプ内のレコードがバッファに対して大きすぎます。

3

割込みが発生しました。

8

キャッシュ・ファンクションは、シングルトン・パイプを使用する場合にのみ指定できます。

ORA-23322

ユーザーにはパイプから読み取るための十分な権限がありません。

使用上のノート

パイプからメッセージを受信するには、まずRECEIVE_MESSAGEをコールします。メッセージを受信すると、パイプから削除されます。したがって、メッセージは1回のみ受信できます。暗黙的に作成されたパイプの場合、最後のレコードがパイプから削除されたあと、パイプは削除されます。

RECEIVE_MESSAGEをコールするときに指定したパイプがまだ存在しない場合、Oracleは暗黙的にパイプを作成し、メッセージの受信を待機します。メッセージが指定されたタイムアウト間隔内に届かない場合は、呼び出しが戻ってパイプが削除されます。

メッセージを受信した後、メッセージ内の個々のアイテムにアクセスするには、UNPACK_MESSAGEを1つ以上コールする必要があります。UNPACK_MESSAGEプロシージャは、タイプDATENUMBERVARCHAR2のアイテムをアンパックするためにオーバーロードされ、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;
パラメータ データ型 摘要

pipename

VARCHAR2

シングルトン・パイプの名前。

返品 摘要
0 成功
ゼロ以外 DBMS_PIPE.RECEIVE_MESSAGEから戻された失敗値

シングルトン・パイプのリーダ・セッションから複雑さのカプセル化と抽象化を実現するキャッシュ関数を定義します。キャッシュ・ファンクションの一般的な操作は次のとおりです。

  • DBMS_PIPE.CREATE_PIPEを使用して、明示的パイプのシングルトン・パイプを作成します。
  • シングルトン・パイプにキャッシュするメッセージを作成します。
  • メッセージをシングルトン・パイプに送信します。オプションで、暗黙メッセージのshelflifeを指定します。

例外

表6-7 RECEIVE_MESSAGEファンクションの例外

例外 摘要

Null pipe name

権限エラーが発生しました。パイプからレコードを削除するには権限が不十分です。パイプは別の人が所有しています。

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ファンクションのパラメータ

パラメータ 摘要

pipename

メッセージを配置するパイプの名前。

明示的なパイプを使用している場合、これはCREATE_PIPEをコールしたときに指定した名前です。

注意: 'ORA$'で始まるパイプ名は使用しないでください。これらの名前は、Oracleが提供するプロシージャで使用するために予約されています。パイプ名は128バイトより長くしないでください。大/小文字は区別されません。現時点では、名前にグローバリゼーション・サポート文字を含めることはできません。

timeout

パイプにメッセージを配置しようとして待機する時間(秒)。

デフォルト値は定数MAXWAITで、86400000 (1000日)として定義されます。

maxpipesize

パイプに許可される最大サイズ(バイト単位)。

パイプ上のすべてのメッセージの合計サイズがこの量を超えることはできません。この最大値を超えると、メッセージはブロックされます。デフォルトは65536バイトになります。

パイプのmaxpipesizeは、パイプの特性の一部となり、パイプの存続期間中保持されます。値が大きいSEND_MESSAGEのコール元は、maxpipesizeを増やします。値が小さい発信者は、既存の大きい値を使用します。

SEND_MESSAGEプロシージャの一部としてmaxpipesizeを指定すると、パイプを個別に開く必要がなくなります。パイプを明示的に作成した場合は、オプションのmaxpipesizeパラメータを使用して、作成パイプ・サイズの指定をオーバーライドできます。

デフォルトのmaxpipesizeである65536は、すべてのパイプに適用できます。

singleton

TRUEを使用して、シングルトン・パイプを作成します。

デフォルト値: FALSE

shelflife

シングルトンパイプにキャッシュされたメッセージの有効期限(秒)。

指定されたshelflife時間を超えると、メッセージはパイプからアクセスできなくなります。パラメータshelflifeは、シングルトン・パイプにのみ適用されます。

デフォルト値は0で、メッセージが失効しないことを意味します。

戻り値

表6-9 SEND_MESSAGEファンクションの戻り値

返品 摘要

0

成功。

パイプがすでに存在し、作成しようとしているユーザーがパイプの使用を承認されている場合、Oracleは成功を示す0を返し、パイプにすでに存在するデータは残ります。

SYSDBS/SYSOPERとして接続されたユーザーがパイプを再作成すると、Oracleはステータス0を返しますが、パイプの所有権は変更されません。

1

タイムアウト。

このプロシージャは、パイプのロックを取得できないか、パイプがいっぱいになって使用できないためにタイムアウトすることがあります。パイプが暗黙的に作成され、空の場合は削除されます。

3

割込みが発生しました。

パイプが暗黙的に作成され、空の場合は削除されます。

6

既存のパイプをシングルトンパイプに変換できませんでした。

  • 複数の既存のメッセージを含む暗黙的パイプは、シングルトンパイプに変換できません。
  • シングルトンではない明示的なパイプの場合、DBMS_PIPE.SEND_MESSAGEはシングルトン引数がTRUEに設定されているメッセージを送信できません。

7

shelflifeパラメータに0以外の値が指定され、パイプはシングルトン・パイプではありません。

ORA-23322

権限が不十分です。

同じ名前のパイプが存在し、別のユーザーによって作成された場合、OracleはエラーORA-23322を示し、ネーミング競合を示します。

例外

表6-10 SEND_MESSAGEファンクションの例外

例外 摘要

Null pipe name

権限エラーが発生しました。パイプへの書込み権限が不十分です。パイプはプライベートであり、他のユーザーが所有しています。

DBMS_PIPE永続メッセージング・パイプの概要

パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクションおよびアラートなど、複数の潜在的なアプリケーションがあります。

自律型AIデータベースでは、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を使用するAutonomous AI Databaseインスタンスが1つあり、WE8MSWIN1252を使用する別のインスタンスがある場合、これらの2つのデータベース間でDBMS_PIPEを含むメッセージを送信することはできません。この場合、これらの2つのデータベース間でDBMS_PIPEを含むメッセージを送信しようとすると、エラーORA-12704が発生します。

詳細は、Autonomous AI Databaseの文字セットの選択を参照してください。

永続メッセージングのDBMS_PIPEサブプログラムの要約

この表は、DBMS_PIPEサブプログラムを示し、簡単に説明しています。

表6-11 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;

パラメータ

表6-12 CREATE_PIPEファンクションのパラメータ

パラメータ 摘要

pipename

作成するパイプの名前。

SEND_MESSAGEおよびRECEIVE_MESSAGEをコールする場合は、この名前を使用する必要があります。この名前はインスタンス全体で一意である必要があります。

注意: ORA$で始まるパイプ名は使用しないでください。これらは、Oracleが提供するプロシージャで使用するために予約されています。パイプ名は128バイトより長くしないでください。大/小文字は区別されません。現時点では、名前にグローバリゼーション・サポート文字を含めることはできません。

maxpipesize

パイプに許可される最大サイズ(バイト単位)。

パイプ上のすべてのメッセージの合計サイズがこの量を超えることはできません。この最大値を超えると、メッセージはブロックされます。

デフォルトのmaxpipesizeは66536バイトです。

パイプのmaxpipesizeは、パイプの特性の一部となり、パイプの存続期間中保持されます。値が大きいSEND_MESSAGEのコール元は、maxpipesizeを増やします。値が小さい発信者は、既存の大きい値を使用します。

デフォルトのmaxpipesizeである65536は、すべてのパイプに適用できます。

private

デフォルトのTRUEを使用して、プライベート・パイプを作成します。

パブリック・パイプは、SEND_MESSAGEをコールするときに暗黙的に作成できます。

戻り値

表6-13 CREATE_PIPEファンクションの戻り値

返品 摘要

0

成功しました。

パイプがすでに存在し、作成しようとしているユーザーがパイプの使用を承認されている場合、Oracleは成功を示す0を返し、パイプにすでに存在するデータは残ります。

ORA-23322

名前の競合が原因で失敗しました。

同じ名前のパイプが存在し、別のユーザーによって作成された場合、OracleはエラーORA-23322を示し、ネーミング競合を示します。

例外

表6-14 CREATE_PIPEファンクションの例外

例外 摘要

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;

パラメータ

表6-15 RECEIVE_MESSAGEファンクションのパラメータ

パラメータ 摘要

pipename

メッセージを受信するパイプの名前。

ORA$で始まる名前は、Oracleで使用するために予約されています。

timeout

メッセージを待機する時間(秒)。タイムアウト0を指定すると、ブロックせずに読み込むことができます。

タイムアウトには、cache_funcパラメータで指定されたキャッシュ関数の実行に要した時間は含まれません。

デフォルト値: 定数MAXWAITで、86400000 (1000日)として定義されます。

credential_name

メッセージの格納に使用されるクラウド・ストアの資格証明名。

credential_nameは、デフォルトでNULLとして初期化されるパッケージ引数です。

この値は、DBMS_PIPE.RECEIVE_MESSAGEをコールする前に設定できます。渡されたパラメータ値は、グローバル変数の値よりも優先されます。

資格証明オブジェクトには、DBMS_PIPE.RECEIVE_MESSAGEを実行しているユーザーによるEXECUTEおよびREAD/WRITE権限が必要です。

credential_name値は、OCIリソース・プリンシパル、Azureサービス・プリンシパル、Amazonリソース名(ARN)またはGoogleサービス・アカウントです。リソース・プリンシパル・ベースの認証の詳細は、リソースにアクセスするためのポリシーおよびロールの構成を参照してください。

location_uri

メッセージの格納に使用されるクラウド・ストアの場所URI。

location_uriは、デフォルトでNULLとして初期化されるグローバル変数です。

この値は、DBMS_PIPE.RECEIVE_MESSAGEをコールする前に設定できます。渡されたパラメータ値は、グローバル変数の値よりも優先されます。

戻り値

表6-16 RECEIVE_MESSAGEファンクションの戻り値

返品 摘要

0

成功

1

タイムアウト。パイプが暗黙的に作成され、空の場合は削除されます。

2

パイプ内のレコードがバッファに対して大きすぎます。

3

割込みが発生しました。

ORA-23322

ユーザーにはパイプから読み取るための十分な権限がありません。

使用上のノート

  • パイプからメッセージを受信するには、まずRECEIVE_MESSAGEをコールします。メッセージを受信すると、パイプから削除されます。したがって、メッセージは1回のみ受信できます。暗黙的に作成されたパイプの場合、最後のレコードがパイプから削除されたあと、パイプは削除されます。

  • RECEIVE_MESSAGEをコールするときに指定したパイプがまだ存在しない場合、Oracleは暗黙的にパイプを作成し、メッセージの受信を待機します。メッセージが指定されたタイムアウト間隔内に届かない場合は、呼び出しが戻ってパイプが削除されます。

  • メッセージを受信した後、メッセージ内の個々のアイテムにアクセスするには、UNPACK_MESSAGEを1つ以上コールする必要があります。UNPACK_MESSAGEプロシージャは、タイプDATENUMBERVARCHAR2のアイテムをアンパックするためにオーバーロードされ、RAWおよびROWIDアイテムを解凍する追加のプロシージャが2つあります。解凍しようとしているデータの型がわからない場合は、NEXT_ITEM_TYPEをコールして、バッファ内の次の項目の型を確認します。

  • 永続メッセージは、1つのプロセスによる書込みまたは読取りのいずれかが保証されます。これにより、同時書込みおよび同時読取りによるメッセージ・コンテンツの不整合が回避されます。永続メッセージ・パイプを使用すると、DBMS_PIPEでは、メッセージまたは受信メッセージの送信を一度にアクティブにする1つの操作のみ許可されます。ただし、進行中の操作のために操作を実行できない場合、プロセスはtimeout値に達するまで定期的に再試行します。

  • Oracle Cloud Infrastructure Object Storageを使用してメッセージを格納する場合は、Oracle Cloud InfrastructureのネイティブURIまたはSwift URIを使用できます。ただし、ロケーションURIと資格証明は、次のようにタイプで一致する必要があります。

    • Oracle Cloud Infrastructure Object StorageへのアクセスにネイティブURI形式を使用する場合は、資格証明オブジェクトでネイティブOracle Cloud Infrastructure署名キー認証を使用する必要があります。

    • Swift URI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスするには、資格証明オブジェクトで認証トークン認証を使用する必要があります。

例外

表6-17 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;

パラメータ

表6-18 SEND_MESSAGEファンクションのパラメータ

パラメータ 摘要
credential_name

メッセージの格納に使用されるクラウド・ストアの資格証明名。

credential_nameは、デフォルトでNULLとして初期化されるパッケージ引数です。

この値は、DBMS_PIPE.SEND_MESSAGEをコールする前に設定できます。渡されたパラメータ値は、グローバル変数の値よりも優先されます。

資格証明オブジェクトには、DBMS_PIPE.SEND_MESSAGEを実行しているユーザーによるEXECUTEおよびREAD/WRITE権限が必要です。

credential_name値は、OCIリソース・プリンシパル、Azureサービス・プリンシパル、Amazonリソース名(ARN)またはGoogleサービス・アカウントです。リソース・プリンシパル・ベースの認証の詳細は、リソースにアクセスするためのポリシーおよびロールの構成を参照してください。

location_uri

メッセージの格納に使用されるクラウド・ストアの場所URI。

location_uriは、デフォルトでNULLとして初期化されるグローバル変数です。

この値は、DBMS_PIPE.SEND_MESSAGEをコールする前に設定できます。渡されたパラメータ値は、グローバル変数の値よりも優先されます。

maxpipesize

パイプに許可される最大サイズ(バイト単位)。

パイプ上のすべてのメッセージの合計サイズがこの量を超えることはできません。この最大値を超えると、メッセージはブロックされます。デフォルトは65536バイトになります。

パイプのmaxpipesizeは、パイプの特性の一部となり、パイプの存続期間中保持されます。値が大きいSEND_MESSAGEのコール元は、maxpipesizeを増やします。値が小さい発信者は、既存の大きい値を使用します。

SEND_MESSAGEプロシージャの一部としてmaxpipesizeを指定すると、パイプを個別に開く必要がなくなります。パイプを明示的に作成した場合は、オプションのmaxpipesizeパラメータを使用して、作成パイプ・サイズの指定をオーバーライドできます。

デフォルトのmaxpipesizeである65536は、すべてのパイプに適用できます。

pipename

メッセージを配置するパイプの名前。

明示的なパイプを使用している場合、これはCREATE_PIPEをコールしたときに指定した名前です。

注意: 'ORA$'で始まるパイプ名は使用しないでください。これらの名前は、Oracleが提供するプロシージャで使用するために予約されています。パイプ名は128バイトより長くしないでください。大/小文字は区別されません。現時点では、名前にグローバリゼーション・サポート文字を含めることはできません。

timeout

パイプにメッセージを配置しようとして待機する時間(秒)。

デフォルト値は定数MAXWAITで、86400000 (1000日)として定義されます。

戻り値

表6-19 SEND_MESSAGEファンクションの戻り値

返品 摘要

0

成功。

パイプがすでに存在し、作成しようとしているユーザーがパイプの使用を承認されている場合、Oracleは成功を示す0を返し、パイプにすでに存在するデータは残ります。

SYSDBS/SYSOPERとして接続されたユーザーがパイプを再作成すると、Oracleはステータス0を返しますが、パイプの所有権は変更されません。

1

タイムアウト。

このプロシージャは、パイプのロックを取得できないか、パイプがいっぱいになって使用できないためにタイムアウトすることがあります。パイプが暗黙的に作成され、空の場合は削除されます。

3

割込みが発生しました。

パイプが暗黙的に作成され、空の場合は削除されます。

ORA-23322

権限が不十分です。

同じ名前のパイプが存在し、別のユーザーによって作成された場合、OracleはエラーORA-23322を示し、ネーミング競合を示します。

使用上のノート

  • 永続メッセージは、1つのプロセスによる書込みまたは読取りのいずれかが保証されます。これにより、同時書込みおよび同時読取りによるメッセージ・コンテンツの不整合が回避されます。永続メッセージ・パイプを使用すると、DBMS_PIPEでは、メッセージまたは受信メッセージの送信を一度にアクティブにする1つの操作のみ許可されます。ただし、進行中の操作のために操作を実行できない場合、プロセスはtimeout値に達するまで定期的に再試行します。

  • Oracle Cloud Infrastructure Object Storageを使用してメッセージを格納する場合は、Oracle Cloud InfrastructureのネイティブURIまたはSwift URIを使用できます。ただし、ロケーションURIと資格証明は、次のようにタイプで一致する必要があります。

    • Oracle Cloud Infrastructure Object StorageへのアクセスにネイティブURI形式を使用する場合は、資格証明オブジェクトでネイティブOracle Cloud Infrastructure署名キー認証を使用する必要があります。

    • Swift URI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスするには、資格証明オブジェクトで認証トークン認証を使用する必要があります。

例外

表6-20 SEND_MESSAGEファンクションの例外

例外 摘要

Null pipe name

権限エラーが発生しました。パイプへの書込み権限が不十分です。パイプはプライベートであり、他のユーザーが所有しています。

SET_CREDENTIAL_NAMEプロシージャ

このプロシージャは、パイプ・メッセージがクラウド・オブジェクト・ストアに格納されるときにデフォルト資格証明として使用されるcredential_name変数を設定します。

構文

DBMS_PIPE.SET_CREDENTIAL_NAME (
   credential_name   IN VARCHAR2 );

パラメータ

パラメータ 摘要

credential_name

クラウド・オブジェクト・ストレージにアクセスするための資格証明の名前。

credential_name値は、OCIリソース・プリンシパル、Azureサービス・プリンシパル、Amazonリソース名(ARN)またはGoogleサービス・アカウントです。リソース・プリンシパル・ベースの認証の詳細は、リソースにアクセスするためのポリシーおよびロールの構成を参照してください。

使用上のノート

Oracle Cloud Infrastructure Object Storageを使用してメッセージを格納する場合は、Oracle Cloud InfrastructureのネイティブURIまたはSwift URIを使用できます。ただし、ロケーションURIと資格証明は、次のようにタイプで一致する必要があります。

  • Oracle Cloud Infrastructure Object StorageへのアクセスにネイティブURI形式を使用する場合は、資格証明オブジェクトでネイティブ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と資格証明は、次のようにタイプで一致する必要があります。

  • Oracle Cloud Infrastructure Object StorageへのアクセスにネイティブURI形式を使用する場合は、資格証明オブジェクトでネイティブ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;
/