すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_AQ

最終更新日:Jun 05, 2024

DBMS_AQパッケージのストアドプロシージャを使用して、キューにメッセージを追加したり、キューからメッセージを削除したり、手続き型言語for SQL (PL/SQL) コールバックプロシージャを登録または登録解除したりできます。

PolarDBは、次のSQL文を使用して、DBMS_AQパッケージの拡張機能も提供します。
  • ALTER QUEUE
  • ALTER QUEUEテーブル
  • クエリの作成
  • キューテーブルの作成
  • ドロップキュー
  • ドロップキューテーブル
表1. DBMS_AQ関数とストアドプロシージャ
関数またはストアドプロシージャ戻り値タイプ説明
ENQUEUEN/Aメッセージをキューに投稿します。
DEQUEUEN/Aメッセージが使用可能な場合、またはメッセージが使用可能になった場合は、キューからメッセージを取得します。
REGISTERN/Aコールバックプロシージャを登録します。
UNREGISTERN/Aコールバックプロシージャの登録を解除します。
次の表に、PolarDBでサポートされる定数を示します。
定数説明適用パラメータ
DBMS_AQ.BROWSE (0)ロックせずにメッセージを読み取ります。 dequeue_options_t.dequeue_mode
DBMS_AQ.LOCKED (1)PL/SQL定数パッケージの範囲内に収まる定数。 dequeue_options_t.dequeue_mode
DBMS_AQ.REMOVE (2)読み込まれたメッセージを削除します。 このパラメータはデフォルト値です。 dequeue_options_t.dequeue_mode
DBMS_AQ.REMOVE_NODATA (3)PL/SQL定数パッケージの範囲内に収まる定数。 dequeue_options_t.dequeue_mode
DBMS_AQ.FIRST_MESSAGE (0)検索用語に一致する最初の利用可能なメッセージを返します。 dequeue_options_t.navigation
DBMS_AQ.NEXT_MESSAGE (1)検索用語に一致する次の利用可能なメッセージを返します。 dequeue_options_t.navigation
DBMS_AQ.NEXT_TRANSACTION (2)PL/SQL定数パッケージの範囲内に収まる定数。 dequeue_options_t.navigation
DBMS_AQ.FOREVER (0)検索キーワードに一致するメッセージが見つからない場合は待機します。 このパラメータはデフォルト値です。 dequeue_options_t.wait
DBMS_AQ.NO_WAIT (1)検索キーワードに一致するメッセージが見つからない場合は待機しません。 dequeue_options_t.wait
DBMS_AQ.ON_COMMIT (0)PL/SQL定数パッケージの範囲内に収まる定数。 enqueue_options_t.visibility, dequeue_options_t.visibility
DBMS_AQ.IMMEDIATE (1)PL/SQL定数パッケージの範囲内に収まる定数。 enqueue_options_t.visibility, dequeue_options_t.visibility
DBMS_AQ.PERSISTENT (0)メッセージはテーブルに保存する必要があります。 enqueue_options_t.delivery_mode
DBMS_AQ.BUFFERED (1)PL/SQL定数パッケージの範囲内に収まる定数。 enqueue_options_t.delivery_mode
DBMS_AQ.READY (0)メッセージを処理する準備ができていることを示します。 message_properties_t.state
DBMS_AQ.WAITING (1)メッセージが処理待ちであることを示します。 message_properties_t.state
DBMS_AQ.PROCESSED (2)メッセージが処理されたことを明示します。 message_properties_t.state
DBMS_AQ.EXPIRED (3)メッセージが例外キューにあることを示します。 message_properties_t.state
DBMS_AQ.NO_DELAY (0)PL/SQL定数パッケージの範囲内に収まる定数。 message_properties_t.delay
DBMS_AQ.NEVER (NULL)PL/SQL定数パッケージの範囲内に収まる定数。 message_properties_t.expiration
DBMS_AQ.NAMESPACE_AQ (0)DBMS_AQキューから通知を受信します。 sys.aq$_reg_info.namespace
DBMS_AQ.NAMESPACE_ANONYMOUS (1)PL/SQL定数パッケージの範囲内に収まる定数。 sys.aq$_reg_info.namespace

ENQUEUE

ENQUEUEストアドプロシージャを使用して、エントリをキューに追加できます。 構文:
ENQUEUE (
  queue_name IN VARCHAR2,
  enqueue_options IN DBMS_AQ.ENQUEUE_OPTIONS_T,
  message_properties IN DBMS_AQ.MESSAGE_PROPERTIES_T,
  payload IN <type_name>,
  msgid OUT RAW) 
Parameters
  • queue_name
    既存のキューの名前。 この名前は、スキーマ修飾名とすることができる。
    説明
    • スキーマ名を省略した場合、サーバーはSEARCH_PATHで指定されたスキーマを使用します。
    • 特殊文字を含めるか、大文字と小文字を区別する名前を使用するには、名前を二重引用符で囲みます。
  • enqueue_options
    enqueue_optionsは、enqueue_options_t型の値です。
    DBMS_AQ.ENQUEUE_OPTIONS_Tは記録です (
      visibility BINARY_INTEGER DEFAULT ON_COMMIT,
      relative_msgid RAW(16) DEFAULT NULL,
      sequence_deviation BINARY INTEGER DEFAULT NULL,
      transformation VARCHAR2(61) DEFAULT NULL,
      delivery_mode PLS_INTEGER NOT NULL DEFAULT PERSISTENT); 
    次の表に、enqueue_options_tでサポートされているパラメーター値のみを示します。
    パラメーターデフォルト値
    visibilityON_COMMIT
    delivery_modePERSISTENT
    sequence_deviationNULL
    transformationNULL
    relative_msgidNULL
  • message_properties
    message_propertiesは、message_properties_t型の値です。
    message_properties_tが記録されています (
        priority INTEGER,
        delay INTEGER,
        expiration INTEGER,
        相関文字VARYING(128) COLLATE pg_catalog."C" 、
        attempts INTEGER,
        recipient_list"AQ$_RECIPIENT_LIST_T",
        exception_queue CHARACTER VARYING (61) pg_catalog."C" 、
        enqueue_time TIMESTAMP WITHOUT TIME ZONE,
          state INTEGER,
         original_msgid BYTEA,
          transaction_group CHARACTER VARYING (30) pg_catalog."C" 、
          delivery_mode INTEGER
        次の表に、message_properties_tでサポートされている値を示します。
    パラメーター説明
    priorityキューテーブル定義にpriorityを参照するsorte_listが含まれている場合、このパラメーターはメッセージがデキューされる順序に影響します。 値が小さいほど、デキューの優先順位が高くなります。
    delayメッセージがデキューに使用できるようになるまでの秒数。 または、このパラメーターをNO_DELAYに設定できます。
    expiration の項目は、要求の有効期限切れ時間を ISO 8601 GMT 時間形式で指定します。メッセージの有効期限が切れるまでの秒数。
    correlationエントリに関連付けられたメッセージ。 デフォルト値は NULL です。
    attemptsメッセージのデキューを試行した回数。 この値はシステムによって維持される。
    exception_queue例外キューの名前。 メッセージが期限切れになった場合、または何度もロールバックされたトランザクションによってデキューされた場合、メッセージはこのキューに移動されます。
    enqueue_timeユーザーがプロジェクトに追加された時刻。
    stateこのパラメーターは、DBMS_AQ によって維持されます。 有効な値:
    • DBMS_AQ.READY: キューエントリは遅延していません。
    • DBMS_AQ.WAITING: キューエントリは処理の準備ができています。
    • DBMS_AQ.PROCESSED:キューエントリが処理されました。
    • DBMS_AQ.EXPIRED:キューエントリが例外キューに移動されました。
    original_msgidこのパラメーターは互換性のために使用され、無視できます。
    transaction_groupこのパラメーターは互換性のために使用され、無視できます。
  • payload

    payloadパラメーターを使用して、キューエントリに関連付けられているデータを提供できます。 ペイロードタイプは、対応するキューテーブルを作成するときに指定されたタイプと一致する必要があります。 詳細については、「CREATE_QUEUE_TABLE」をご参照ください。

  • msgid

    msgidパラメーターを使用して、システムによって生成される一意のメッセージ識別子を取得できます。

次の匿名ブロックは、DBMS_AQ.ENQUEUEを呼び出して、work_orderという名前のキューにメッセージを追加します。


  enqueue_options    DBMS_AQ.ENQUEUE_OPTIONS_T;
  message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
  message_handle     raw(16);
  payload work_order;

開始

  payload := work_order('Smith', 'system upgrade');

DBMS_AQ.ENQUEUE (
  queue_name         => 'work_order',
  enqueue_options    => enqueue_options,
  message_properties => message_properties,
  payload            => payload,
  msgid              => message_handle
    );
 エンド; 

DEQUEUE

DEQUEUEストアドプロシージャを使用して、メッセージをデキューできます。 構文:
DEQUEUE (DEQUEUE)
  queue_name IN VARCHAR2,
  dequeue_options IN DBMS_AQ.DEQUEUE_OPTIONS_T,
  message_properties OUT DBMS_AQ.MESSAGE_PROPERTIES_T,
  payload OUT type_name,
  msgid OUT RAW) 
Parameters
  • queue_name
    既存のキューの名前。 この名前は、スキーマ修飾名とすることができる。
    説明
    • スキーマ名を省略した場合、サーバーはSEARCH_PATHで指定されたスキーマを使用します。
    • 特殊文字を含めるか、大文字と小文字を区別する名前を使用するには、名前を二重引用符で囲みます。
  • dequeue_options
    dequeue_optionsは、dequeue_options_t型の値です。
    DEQUEUE_OPTIONS_Tが記録されています (
      consumer_name CHARACTER VARYING(30),
      dequeue_mode INTEGER,
      navigation INTEGER,
      visibility INTEGER,
      wait INTEGER,
      msgid BYTEA,
      correlation CHARACTER VARYING(128),
      deq_condition CHARACTER VARYING(4000),
      transformation CHARACTER VARYING(61),
      delivery_mode INTEGER); 
    次の表に、dequeue_options_tでサポートされている値を示します。
    パラメーター説明
    consumer_nameNULL である必要があります。
    dequeue_modeデキュー操作のロック動作。 有効な値:
    • DBMS_AQ.BROWSE:ロックを取得せずにメッセージを読み取ります。
    • DBMS_AQ.LOCKED: ロックが取得された後にメッセージを読み取ります。
    • DBMS_AQ.REMOVE: メッセージが削除される前にメッセージを読み取ります。
    • DBMS_AQ.REMOVE_NODATA:メッセージを読み取りますが、メッセージは削除しません。
    navigation取得するメッセージを識別します。 有効な値:
    • FIRST_MESSAGE: 検索キーワードと一致するキュー内の最初のメッセージ。
    • NEXT_MESSAGE: 最初のキーワードと一致する次に使用可能なメッセージ。
    visibilityON_COMMIT である必要があります。現在のトランザクションをロールバックすると、デキューされたアイテムはキューに残ります。
    wait0より大きい数値、または次のいずれかの値である必要があります。
    • DBMS_AQ.FOREVER: waits indefinitely.
    • DBMS_AQ.NO_WAIT: does not wait.
    msgidデキューされるメッセージの ID。
    correlationこのパラメーターは互換性のために使用され、無視できます。
    deq_conditionBOOLEAN 値を計算し、メッセージをデキューする必要があるかどうかを指定するVARCHAR2 式。
    transformationこのパラメーターは互換性のために使用され、無視できます。
    delivery_modePERSISTENT である必要があります。 このモードでは、バッファー済みのメッセージはサポートされていません。
  • message_properties
    message_propertiesは、message_properties_t型の値です。
    message_properties_tは記録されています (
        priority INTEGER,
        delay INTEGER,
        expiration INTEGER,
        相関文字VARYING(128) COLLATE pg_catalog."C" 、
        attempts INTEGER,
        recipient_list"AQ$_RECIPIENT_LIST_T",
        exception_queue CHARACTER VARYING (61) pg_catalog."C" 、
        enqueue_time TIMESTAMP WITHOUT TIME ZONE,
        state INTEGER,
        original_msgid BYTEA,
        transaction_group CHARACTER VARYING (30) pg_catalog."C" 、
        delivery_mode INTEGER
      次の表に、message_properties_tでサポートされている値を示します。
    パラメーター説明
    priorityキューテーブル定義にpriorityを参照するsorte_listが含まれている場合、このパラメーターはメッセージがデキューされる順序に影響します。 値が小さいほど、デキューの優先順位が高くなります。
    delayメッセージがデキュー可能になるまでに経過した秒数。 NO_DELAY 定数は、メッセージが利用可能になった直後にメッセージがデキューされることを指定します。
    expiration の項目は、要求の有効期限切れ時間を ISO 8601 GMT 時間形式で指定します。メッセージの有効期限が切れるまでの秒数。
    correlation エントリに関連付けられたメッセージ。 デフォルト値は NULL です。
    attemptsメッセージのデキューを試行した回数。 この値はシステムによって維持される。
    exception_queue例外キューの名前。 メッセージが期限切れになった場合、または何度もロールバックされたトランザクションによってデキューされた場合、メッセージはこのキューに移動されます。
    enqueue_timeユーザーがプロジェクトに追加された時刻。
    stateこのパラメーターは、DBMS_AQ によって維持されます。 有効な値:
    • DBMS_AQ.WAITING: キューエントリは遅延していません。
    • DBMS_AQ.READY: キューエントリは処理の準備ができています。
    • DBMS_AQ.PROCESSED:キューエントリが処理されました。
    • DBMS_AQ.EXPIRED:キューエントリが例外キューに移動されました。
    original_msgidこのパラメーターは互換性のために使用され、無視できます。
    transaction_groupこのパラメーターは互換性のために使用され、無視できます。
    delivery_modeこの演算子はサポートされていません。 DBMS_AQ.PERSISTENT の値を指定します。
  • payload

    payloadパラメーターを使用して、デキュー操作に関与するメッセージのペイロードを取得できます。 ペイロードタイプは、キューテーブルの作成時に指定されたタイプと一致する必要があります。

  • msgid

    msgidパラメーターを使用して、一意のメッセージ識別子を取得できます。

次の匿名ブロックは、DBMS_AQ.DEQUEUEを呼び出して、キューとペイロードからメッセージを取得します:
DECLARE

  dequeue_options    DBMS_AQ.DEQUEUE_OPTIONS_T;
  message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
  message_handle     raw(16);
  payload work_order;

開始
  dequeue_options.dequeue_mode := DBMS_AQ.BROWSE;

  DBMS_AQ.DEQUEUE(
    queue_name         => 'work_queue',
    dequeue_options    => dequeue_options,
    message_properties => message_properties,
    payload            => payload,
    msgid              => message_handle
  );

  DBMS_OUTPUT.PUT_LINE(
  'The next work order is [' || payload.subject || '].'
  );
END; 
ペイロードはDBMS_OUTPUT.PUT_LINEで表示されます。

登録

REGISTERストアドプロシージャを使用して、アイテムがエンキューまたはデキューされたときに通知を受信するために使用される電子メールアドレス、プロシージャ、またはURLを登録できます。 構文:
REGISTER (
  reg_list IN SYS.AQ$_REG_INFO_LIST,
  カウント数) 
Parameters
  • reg_list
    reg_listパラメーターを使用して、AQ$_REG_INFO_listタイプのリストを指定し、登録する各サブスクリプションに関する情報を提供します。 リスト内の各エントリのタイプはAQ$_REG_INFOです。 各エントリに含めることができる属性を次の表に示します。
    属性データ型説明
    nameVARCHAR2 (128)サブスクリプションの名前。 この名前は、スキーマ修飾名とすることができる。
    namespaceNUMERIC値はDBMS_AQ.NAMESPACE_AQ (0) である必要があります。
    callbackVARCHAR2 (4000)通知時に実行されるアクションについて説明します。 PL/SQLストアドプロシージャのみがサポートされています。 プロシージャは、plsql:// schema.procedureの形式で呼び出されます。 次の項目は、このフォームのフィールドを説明します。
    • schemaフィールドは、ストアドプロシージャが存在するスキーマを指定する。
    • プロシージャフィールドは、通知されるストアドプロシージャの名前を指定します。
    contextRAW (16)ストアドプロシージャに必要なユーザー定義の値。
  • カウント

    countパラメーターを使用して、reg_listのエントリ数を指定できます。

次の匿名ブロックは、DBMS_AQ.REGISTERを呼び出して、アイテムがキューに追加またはキューから削除されたときに通知されるストアドプロシージャを登録します。 sys.aq$_reg_infoタイプの属性のセットは、DECLAREセクションで識別される各サブスクリプションに提供されます。
DECLARE
   subscription1 sys.aq$_reg_info;
   subscription2 sys.aq$_reg_info;
   subscription3 sys.aq$_reg_info;
   subscriptionlist sys.aq$_reg_info_list;
開始
   subscription1 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// assign_worker?PR=0 '、HEXTORAW ('FFF'));
   subscription2 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// add_to_history?PR=1 '、HEXTORAW('FFFF'));
   subscription3 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// reserve_parts?PR=2 '、HEXTORAW('FFFF'));

   subscriptionlist := sys.aq$_reg_info_list(subscription1, subscription2, subscription3);
   dbms_aq.register(subscriptionlist, 3);
   commit;
  END;
   /
subscriptionlistパラメーターを使用して、sys.aq$_reg_info_list型のリストを指定し、記述されたsys.aq$_reg_infoオブジェクトを含みます。 リスト名とオブジェクト数がdbms_aq.registerに渡されます。

登録解除

UNREGISTERストアドプロシージャを使用して、エンキューおよびデキューに関連する通知を無効にできます。 構文:
UNREGISTER (
 reg_list IN SYS.AQ$_REG_INFO_LIST,
 カウント
番号で) 
Parameters
  • reg_list

    reg_listパラメーターを使用して、AQ$_REG_INFO_listタイプのリストを指定し、登録する各サブスクリプションに関する情報を提供します。 リスト内の各エントリのタイプはAQ$_REG_INFOです。 各エントリに含めることができる属性を次の表に示します。

    属性データ型説明
    nameVARCHAR2 (128)サブスクリプションの名前。 この名前は、スキーマ修飾名とすることができる。
    namespaceNUMERIC値はDBMS_AQ.NAMESPACE_AQ (0) である必要があります。
    callbackVARCHAR2 (4000)通知時に実行されるアクションについて説明します。 PL/SQLストアドプロシージャのみがサポートされています。 プロシージャは、plsql:// schema.procedureの形式で呼び出されます。 次の項目は、このフォームのフィールドを説明します。
    • schemaフィールドは、ストアドプロシージャが存在するスキーマを指定する。
    • プロシージャフィールドは、通知されるストアドプロシージャの名前を指定します。
    contextRAW (16)ストアドプロシージャに必要なユーザー定義の値。
  • カウント

    countパラメーターを使用して、reg_listのエントリ数を指定できます。

次の匿名ブロックは、DBMS_AQ.UNREGISTERを呼び出して、DBMS_AQ.REGISTERの例で指定されている通知を無効にします。

subscriptionlistパラメーターを使用して、sys.aq$_reg_info_list型のリストを指定し、記述されたsys.aq$_reg_infoオブジェクトを含みます。 リスト名とオブジェクト数がdbms_aq.unregisterに渡されます。
DECLARE
   subscription1 sys.aq$_reg_info;
   subscription2 sys.aq$_reg_info;
   subscription3 sys.aq$_reg_info;
   subscriptionlist sys.aq$_reg_info_list;
開始
   subscription1 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// assign_worker?PR=0 '、HEXTORAW ('FFF'));
   subscription2 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// add_to_history?PR=1 '、HEXTORAW('FFFF'));
   subscription3 := sys.aq$_reg_info('q' 、DBMS_AQ.NAMESPACE_AQ、'plsql:// reserve_parts?PR=2 '、HEXTORAW('FFFF'));

   subscriptionlist := sys.aq$_reg_info_list(subscription1, subscription2, subscription3);
   dbms_aq.unregister(subscriptionlist, 3);
   commit;
  END;
   /