ヘッダーをスキップ
Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド
11gリリース1(11.1)
E05782-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

8 Oracle Streams AQ管理インタフェース

この章では、Oracle Streams Advanced Queuing(AQ)の管理インタフェースについて説明します。

内容は次のとおりです。


関連項目

  • 各プログラム・インタフェースで使用可能な機能のリストは、第3章「Oracle Streams AQ: プログラム・インタフェース」を参照してください。

  • DBMS_AQADMパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


8.1 キュー表の管理

内容は次のとおりです。

8.1.1 キュー表の作成

DBMS_AQADM.CREATE_QUEUE_TABLE(
   queue_table          IN      VARCHAR2,
   queue_payload_type   IN      VARCHAR2,
   [storage_clause      IN      VARCHAR2        DEFAULT NULL,]
   sort_list            IN      VARCHAR2        DEFAULT NULL,
   multiple_consumers   IN      BOOLEAN         DEFAULT FALSE,
   message_grouping     IN      BINARY_INTEGER  DEFAULT NONE,
   comment              IN      VARCHAR2        DEFAULT NULL,
   primary_instance     IN      BINARY_INTEGER  DEFAULT 0,
   secondary_instance   IN      BINARY_INTEGER  DEFAULT 0,
   compatible           IN      VARCHAR2        DEFAULT NULL,
   secure               IN      BOOLEAN         DEFAULT FALSE);

このプロシージャは、事前定義された型のメッセージを格納するキュー表を作成します。このプロシージャの必須パラメータとオプション・パラメータは、次のとおりです。

パラメータ 説明
queue_table この必須パラメータは、キュー表名を指定します。

データベースが10.0互換の場合、キュー表名には大文字および小文字を使用できます。ただし、キュー表名は二重引用符で囲む必要があります。たとえば、abc.efgと指定すると、スキーマがABCで、名前がEFGであることを示しますが、"abc"."efg"と指定した場合は、スキーマがabc、名前がefgであることを意味します。

キュー表名は、24文字より長くできません。長い名前のキュー表を作成しようとすると、エラーORA-24019が発生します。

queue_payload_type この必須パラメータは、ペイロード型をRAWまたはオブジェクト型として指定します。詳細は、「ペイロード型」を参照してください。
storage_clause このオプション・パラメータは、キュー表の表領域を指定します。詳細は、「STORAGE句」を参照してください。
sort_list このオプション・パラメータは、昇順のソート・キーとして1つまたは2つの列が使用されることを指定します。フォーマットはsort_column1,sort_column2です。詳細は、「ソート・キー」を参照してください。
multiple_consumers このオプション・パラメータは、キュー表をシングル・コンシューマまたはマルチ・コンシューマとして指定します。デフォルトのFALSEは、表で作成されたキューにはメッセージごとに1つのコンシューマのみ指定できることを意味します。TRUEは、表で作成されたキューにはメッセージごとにマルチ・コンシューマを指定できることを意味します。
message_grouping このオプション・パラメータは、メッセージがグループ化されるかどうかを指定します。デフォルトのNONEは、各メッセージが個別に処理されることを意味します。TRANSACTIONALは、1つのトランザクションでエンキューされるすべてのメッセージが同じグループの一部とみなされ、関連するメッセージのグループとしてデキューされることを意味します。
comment このオプション・パラメータは、ユーザーが指定したキュー表の説明です。このユーザー・コメントは、キュー・カタログに追加されます。
primary_instance このオプション・パラメータは、キュー表の1次所有者を指定します。キュー・モニターのスケジューリングとキュー表内のキューの伝播は、このインスタンスで実行されます。デフォルト値の0は、キュー・モニターのスケジューリングと伝播が使用可能な任意のインスタンスで実行されることを意味します。

compatible8.1以上の場合のみ、このパラメータを指定および変更できます。

secondary_instance このオプション・パラメータは、プライマリ・インスタンスが使用できない場合のキュー表の所有者を指定します。デフォルト値の0は、キュー表が使用可能な任意のインスタンスにフェイルオーバーされることを意味します。

primary_instanceも指定され、compatible8.1以上の場合のみ、このパラメータを指定して変更できます。

compatible このオプション・パラメータは、そのキュー表が互換性を持つ最も低いデータベース・バージョンを指定します。可能な値は、8.08.1および10.0です。データベースが10.1互換モードの場合、デフォルト値は10.0です。データベースが8.1互換または9.2互換モードの場合、デフォルト値は8.1です。データベースが8.0互換モードの場合、デフォルト値は8.0です。値8.0は、Oracle Streams AQ 10gリリース2(10.2)では廃止されました。

互換性の詳細は、「Oracle Streams AQの互換性パラメータ」を参照してください。

secure キュー表を保護キューに使用する場合は、このオプション・パラメータをTRUEに設定する必要があります。保護キューは、エンキューやデキューなどのキュー操作を実行できる1人以上のデータベース・ユーザーにAQエージェントを明示的に関連付けるためのキューです。保護キューの所有者は、キューですべてのキュー操作を実行できますが、その他のユーザーは、保護キュー・ユーザーとして構成されないかぎりキュー操作を実行できません。

ペイロード型

ペイロード型をオブジェクト型として指定するには、オブジェクト型を定義する必要があります。


注意:

オブジェクト型でシノニムを作成した場合、DBMS_AQADM.CREATE_QUEUE_TABLEで使用することはできません。エラーORA-24015が発生します。

CLOB、BLOBおよびBFILEオブジェクトは、Oracle Streams AQメッセージで有効です。OracleソフトウェアのOracle8iリリース8.1.x以上では、Oracle Streams AQ伝播を使用してこれらのオブジェクト型を伝播できます。LOBを持つオブジェクト型をエンキューするには、まずLOB_attributeEMPTY_BLOB()に設定してからエンキューを実行する必要があります。これによって、キュー表のビューから生成されたLOBロケータを選択でき、標準のLOB操作を使用できます。


注意:

LOBを含むペイロードの場合、エンキューおよびデキュー操作を実行するには、キュー表に対する明示的なSelectInsertおよびUpdate権限を付与する必要があります。

STORAGE句

storage_clause引数には、標準のCREATE TABLE storage_clause引数に使用できるテキストを入力できます。

表領域が指定されたキュー表では、索引構成表(IOT)および索引は、すべてその表領域に作成されます。現在、これらを異なる表領域間に分割することはできません。


注意:

ローカル管理表領域にキュー表を作成するか、2つ以上の空きリスト・グループがあるキュー表を作成する場合、キュー・モニター・コーディネータはそのブロックのクリーン・アップをスキップします。これにより、時間の経過とともにパフォーマンスが低下する可能性があります。

この問題を解決するには、次のコマンドを実行してデキューIOTを結合します。

ALTER TABLE AQ$_queue_table_I COALESCE;

このコマンドは、キューの同時デキュー元およびエンキュー元がある場合に実行できますが、コマンドの実行中に、同時ユーザーのパフォーマンスが若干低下する可能性があります。


ソート・キー

sort_listパラメータは、メッセージがデキューされる順序を決定します。キュー表を作成した後は、メッセージのソート順序を変更することはできません。選択肢は次のとおりです。

  • ENQ_TIME

  • ENQ_TIME,PRIORITY

  • PRIORITY

  • PRIORITY,ENQ_TIME

  • PRIORITY,COMMIT_TIME

  • COMMIT_TIME

COMMIT_TIMEは、Oracle Streams AQ 10gリリース2(10.2)の新機能です。指定すると、キュー表を使用する任意のキューがcommit-timeキューになり、Oracle Streams AQは、トランザクションをコミットするときに、エンキューされたメッセージごとに近似CSCNを計算します。

COMMIT_TIMEをソート・キーとして指定する場合、次の値も指定する必要があります。

  • multiple_consumers = TRUE

  • message_grouping = TRANSACTIONAL

  • compatible = 8.1以上

commit-time順序付けは、トランザクションが相互に依存している場合、またはキュー内のメッセージを参照するときに一貫した結果が必要な場合に便利です。


関連項目:


その他の表およびビュー

表の作成時に、次のオブジェクトが作成されます。

  • AQ$QUEUE_TABLE_NAME: Oracle Streams AQアプリケーションでキュー・データの問合せに使用される読込み専用のビュー

  • AQ$_QUEUE_TABLE_NAME_E: キュー表に対応付けられたデフォルトの例外キュー

  • AQ$_QUEUE_TABLE_NAME_I: マルチ・コンシューマ・キューの場合にデキュー操作に使用される索引または索引構成表(IOT)

  • AQ$_QUEUE_TABLE_NAME_T: キュー・モニター操作の索引

次のオブジェクトは、8.1互換のマルチ・コンシューマ・キュー表でのみ作成されます。

  • AQ$_queue_table_name_S: サブスクライバに関する情報の格納に使用される表

  • AQ$_queue_table_name_H: デキュー履歴データの格納に使用される索引構成表(IOT)


注意:

Oracle Streams AQでは、これらの内部AQのキュー表に対するトリガーの使用はサポートされていません。


関連項目:

『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

スキーマを指定しない場合、デフォルトのスキーマはそのユーザーのスキーマになります。

GLOBAL_TOPIC_ENABLED = TRUEの場合は、キュー表が作成されると、対応するLightweight Directory Access Protocol(LDAP)エントリも作成されます。

キュー・タイプがANYDATAの場合、バッファ・キューおよび2つの追加オブジェクトが作成されます。バッファ・キューは、取得プロセスによって作成された論理変更レコードを格納します。論理変更レコードは、キューに関連付けられたメモリー・バッファでステージングされます。通常は、ディスクには書き込まれません。

デキューされずに一定の期間バッファ内でステージングされているか、すべての取得済イベントを保持するのに十分な空きがメモリーにない場合、論理変更レコードは次の表に流出します。

  • AQ$_QUEUE_TABLE_NAME_P: メモリーから流出した取得済イベントの格納に使用される表

  • AQ$_QUEUE_TABLE_NAME_d: 伝播に関する情報の格納と、各イベントの処理に適したプロセスの適用に使用される表


関連項目:

『Oracle Streams概要および管理』の第3章「Oracle Streamsのステージングおよび伝播」

次の例では、SQL*Plusテスト環境を使用していることを前提にしています。例8-1では、この章にある他の例の準備としてユーザーを作成します。この例では、管理者権限を持つユーザーとして接続する必要があります。この章にある他の例のほとんどでは、ユーザーtest_admとして接続できます。いくつかの例は、DBMS_AQADMEXECUTE権限を使用してtestとして実行する必要があります。

例8-1 AQ管理ユーザーの設定

CREATE USER test_adm IDENTIFIED BY test_adm DEFAULT TABLESPACE example;
GRANT DBA, CREATE ANY TYPE TO test_adm;
GRANT EXECUTE ON DBMS_AQADM TO test_adm;
GRANT aq_administrator_role TO test_adm;
BEGIN
   DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
      privilege          =>    'MANAGE_ANY',
      grantee            =>    'test_adm',
      admin_option       =>     FALSE);
END;
/
CREATE USER test IDENTIFIED BY test;
GRANT DBA TO test;
GRANT EXECUTE ON dbms_aq TO test;

例8-2 AQ管理のサンプル・タイプの設定

CREATE TYPE test.message_typ AS object(
   sender_id              NUMBER,
   subject                VARCHAR2(30),
   text                   VARCHAR2(1000));
/
CREATE TYPE test.msg_table AS TABLE OF test.message_typ;
/
CREATE TYPE test.order_typ AS object(
   custno                 NUMBER,
   item                   VARCHAR2(30),
   description            VARCHAR2(1000));
/
CREATE TYPE test.lob_typ AS object(
   id                     NUMBER,
   subject                VARCHAR2(100),
   data                   BLOB,
   trailer                NUMBER);
/

例8-3 オブジェクト型メッセージのキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.obj_qtab',
      queue_payload_type     => 'test.message_typ');
END;
/

例8-4 RAW型メッセージのキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.raw_qtab',
      queue_payload_type     => 'RAW');
END;
/

例8-5 LOB型メッセージのキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.lob_qtab',
      queue_payload_type     => 'test.lob_typ');
END;
/

例8-6 XMLTypeメッセージのキュー表の作成

BEGIN
  DBMS_AQADM.CREATE_QUEUE_TABLE(
     queue_table         => 'test.xml_qtab',
     queue_payload_type  => 'SYS.XMLType',
     multiple_consumers  => TRUE,
     compatible          => '8.1',
     comment             => 'Overseas Shipping multiconsumer orders queue table');
END;
/

例8-7 グループ化メッセージのキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table          => 'test.group_qtab',
      queue_payload_type   => 'test.message_typ',
      message_grouping     => DBMS_AQADM.TRANSACTIONAL);
END;
/

例8-8 優先メッセージおよびマルチ・コンシューマのキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.priority_qtab',
      queue_payload_type     => 'test.order_typ',
      sort_list              => 'PRIORITY,ENQ_TIME',
      multiple_consumers     => TRUE);
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.multiconsumer_qtab',
      queue_payload_type     => 'test.message_typ',
      sort_list              => 'PRIORITY,ENQ_TIME',
      multiple_consumers     => TRUE);
END;
/

例8-9 Commit-Time順序付けを使用したキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.commit_time_qtab',
      queue_payload_type     => 'test.message_typ',
      sort_list              => 'COMMIT_TIME',
      multiple_consumers     => TRUE,
      message_grouping       => DBMS_AQADM.TRANSACTIONAL,
      compatible             => '10.0');
END;
/

例8-10 マルチ・コンシューマの8.1互換キュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.multiconsumer_81_qtab',
      queue_payload_type     => 'test.message_typ',
      multiple_consumers     =>  TRUE,
      compatible             => '8.1');
END;
/

例8-11 指定した表領域に対するキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table        => 'test.example_qtab',
      queue_payload_type => 'test.message_typ',
      storage_clause     => 'tablespace example');
END;
/

例8-12 空きリストまたは空きリスト・グループがあるキュー表の作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE_TABLE(
      queue_table            => 'test.freelist_qtab',
      queue_payload_type     => 'RAW',
      storage_clause         => 'STORAGE (FREELISTS 4 FREELIST GROUPS 2)',
      compatible             => '8.1');
END;
/

8.1.2 キュー表の変更

DBMS_AQADM.ALTER_QUEUE_TABLE (
   queue_table          IN   VARCHAR2,
   comment              IN   VARCHAR2       DEFAULT NULL,
   primary_instance     IN   BINARY_INTEGER DEFAULT NULL,
   secondary_instance   IN   BINARY_INTEGER DEFAULT NULL);

このプロシージャは、キュー表の既存のプロパティを変更します。

パラメータ 説明
queue_table この必須パラメータは、キュー表名を指定します。
comment このオプション・パラメータは、ユーザーが指定したキュー表の説明です。このユーザー・コメントは、キュー・カタログに追加されます。
primary_instance このオプション・パラメータは、キュー表の1次所有者を指定します。キュー・モニターのスケジューリングとキュー表内のキューの伝播は、このインスタンスで実行されます。

compatible8.1以上の場合のみ、このパラメータを指定および変更できます。

secondary_instance このオプション・パラメータは、プライマリ・インスタンスが使用できない場合のキュー表の所有者を指定します。

primary_instanceも指定され、compatible8.1以上の場合のみ、このパラメータを指定して変更できます。



注意:

一般に、キュー表ではDDL文はサポートされていないため、キュー表が操作不可能になる場合があります。たとえば、キュー表に対してALTER TABLE ...SHRINK文を発行すると、内部エラーが発生し、その後キュー表を使用しようとしても、常にエラーになります。キュー表ではDDL文を使用しないことをお薦めします。

GLOBAL_TOPIC_ENABLED = TRUEの場合は、キュー表が変更されると、対応するLDAPエントリも変更されます。

例8-13 プライマリおよびセカンダリ・インスタンスの変更によるキュー表の変更

BEGIN
   DBMS_AQADM.ALTER_QUEUE_TABLE(
      queue_table          => 'test.obj_qtab',
      primary_instance     => 3,
      secondary_instance   => 2);
END;
/

例8-14 コメントの変更によるキュー表の変更

BEGIN
   DBMS_AQADM.ALTER_QUEUE_TABLE(
      queue_table          => 'test.obj_qtab',
      comment              => 'revised usage for queue table');
END;
/

8.1.3 キュー表の削除

DBMS_AQADM.DROP_QUEUE_TABLE(
   queue_table       IN    VARCHAR2,
   force             IN    BOOLEAN DEFAULT FALSE,

このプロシージャは、既存のキュー表を削除します。キュー表を削除する前に、そのキュー表内のすべてのキューを停止して削除する必要があります。forceFALSEに設定されている場合、明示的に実行する必要があります。forceTRUEに設定されている場合、キュー表内のすべてのキューと関連付けられた伝播スケジュールが自動的に削除されます。

GLOBAL_TOPIC_ENABLED = TRUEの場合は、キュー表が削除されると、対応するLDAPエントリも削除されます。

例8-15 キュー表の削除

BEGIN
   DBMS_AQADM.DROP_QUEUE_TABLE(
      queue_table        => 'test.obj_qtab');
END;
/

例8-16 forceオプションを使用したキューの削除

BEGIN
   DBMS_AQADM.DROP_QUEUE_TABLE(
      queue_table        => 'test.raw_qtab',
      force              => TRUE);
END;
/

8.1.4 キュー表のパージ

DBMS_AQADM.PURGE_QUEUE_TABLE(
   queue_table        IN   VARCHAR2,
   purge_condition    IN   VARCHAR2,
   purge_options      IN   aq$_purge_options_t);

このプロシージャは、キュー表からメッセージをパージします。パラメータは次のとおりです。

パラメータ 説明
queue_table この必須パラメータは、キュー表名を指定します。
purge_condition パージ条件には、大文字と小文字を区別するSQLのWHERE句を使用する必要があります。条件はaq$queue_table_nameビューの列に基づいています。パージ条件の各列名には、「qtview」という接頭辞が付きます。

永続メッセージでサポートされるパージ条件はすべて、バッファ済メッセージでもサポートされます。

キュー表のすべてのキューをパージするには、purge_conditionNULL(引用符を使用しない)または''(一重引用符2つ)に設定します。

purge_options Type aq$_purge_options_t型にはblockパラメータが含まれます。blockTRUEの場合、キュー表をパージする間、キュー表内のすべてのキューで排他的ロックが保持されます。これにより、キュー表のパージ中に同時エンキュー元およびデキュー元がブロックされます。blockTRUEの場合、パージ・コールは常に成功します。blockのデフォルトはFALSEです。これは、エンキュー元およびデキュー元をブロックしませんが、同時処理時間が長いと、パージが失敗してエラーが発生する可能性があります。

aq$_purge_options_t型にはdelivery_modeパラメータも含まれています。デフォルトのPERSISTENTの場合は、永続メッセージのみがパージされます。BUFFEREDに設定されている場合は、バッファ済メッセージのみがパージされます。PERSISTENT_OR_BUFFEREDに設定されている場合は、両方がパージされます。


このプロシージャを実行すると、トレース・ファイルがudump先に生成されます。このトレース・ファイルには、プロシージャの詳細な実行内容が出力されます。プロシージャはすべてのメッセージを処理した後、コミットします。


関連項目:

DBMS_AQADM.PURGE_QUEUE_TABLEの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_AQADMに関する項を参照してください。

例8-17 キュー表のすべてのメッセージのパージ

DECLARE
po dbms_aqadm.aq$_purge_options_t;
BEGIN
   po.block := FALSE;
   DBMS_AQADM.PURGE_QUEUE_TABLE(
     queue_table     => 'test.obj_qtab',
     purge_condition => NULL,
     purge_options   => po);
END;
/

例8-18 指定したキューのすべてのメッセージのパージ

DECLARE
po dbms_aqadm.aq$_purge_options_t;
BEGIN
   po.block := TRUE;
   DBMS_AQADM.PURGE_QUEUE_TABLE(
     queue_table     => 'test.obj_qtab',
     purge_condition => 'qtview.queue = ''TEST.OBJ_QUEUE''',
     purge_options   => po);
END;
/

例8-19 指定したキューのすべてのPROCESSEDメッセージのパージ

DECLARE
po dbms_aqadm.aq$_purge_options_t;
BEGIN
   po.block := TRUE;
   DBMS_AQADM.PURGE_QUEUE_TABLE(
     queue_table     => 'test.obj_qtab',
     purge_condition => 'qtview.queue = ''TEST.OBJ_QUEUE''
                         and qtview.msg_state = ''PROCESSED''',
     purge_options   => po);
END;
/

例8-20 指定したキューと指定したコンシューマのすべてのメッセージのパージ

DECLARE
po dbms_aqadm.aq$_purge_options_t;
BEGIN
   po.block := TRUE;
   DBMS_AQADM.PURGE_QUEUE_TABLE(
     queue_table     => 'test.multiconsumer_81_qtab',
     purge_condition => 'qtview.queue = ''TEST.MULTICONSUMER_81_QUEUE''
                         and qtview.consumer_name = ''PAYROLL_APP''',
     purge_options   => po);
END;
/

注意:

例8-20consumer_name例8-21sender_nameなど、一部のパージ条件は、8.1互換のキュー表でのみサポートされています。詳細は、表9-1「AQ$Queue_Table_Nameビュー」を参照してください。

例8-21 指定した送信者からのすべてのメッセージの削除

DECLARE
po dbms_aqadm.aq$_purge_options_t;
BEGIN
   po.block := TRUE;
   DBMS_AQADM.PURGE_QUEUE_TABLE(
     queue_table     => 'test.multiconsumer_81_qtab',
     purge_condition => 'qtview.sender_name = ''TEST.OBJ_QUEUE''',
     purge_options   => po);
END;
/

8.1.5 キュー表の移行

DBMS_AQADM.MIGRATE_QUEUE_TABLE(
   queue_table   IN   VARCHAR2,
   compatible    IN   VARCHAR2);

このプロシージャは、8.0、8.1または10.0のキュー表を8.0、8.1または10.0に移行します。移行を実行できるのは、キュー表の所有者のみです。


注意:

このプロシージャでは、キュー表の所有者(通常のキュー・ユーザー)にDBMS_AQADMEXECUTE権限を付与する必要があります。通常のキュー・ユーザーに対してキューおよびキュー表の作成と削除、サブスクライバの追加と削除などを許可しない場合は、移行完了の直後にEXECUTE権限を取り消す必要があります。


注意:

compatible8.0に設定されているキュー表で作成されたキュー(このマニュアルでは8.0形式のキューと呼びます)は、Oracle Streams AQ 10gリリース2(10.2)では廃止されています。したがって、新しいキューの作成には8.1以降の形式を使用し、既存の8.0形式のキューをなるべく早く移行することをお薦めします。

スキーマが下位リリースからエクスポートされたダンプのインポートによって作成された場合、またはスキーマに下位リリースからアップグレードされたOracle Streams AQキューがある場合は、DROP USER CASCADEを使用してスキーマを削除しようとすると、ORA-24005エラーが発生します。このようなスキーマを削除するには、次の手順に従います。

  1. イベント10851をレベル1に設定します。

  2. AQ$_queue_table_name_NRという形式のすべての表をスキーマから削除します。

  3. イベント10851をオフにします。

  4. スキーマを削除します。

例8-22 8.1互換から10.0互換へのキュー表のアップグレード

BEGIN
   DBMS_AQADM.MIGRATE_QUEUE_TABLE (
           queue_table    => 'test.xml_qtab',
           compatible     => '10.0');
END;
/

8.2 キューの管理

内容は次のとおりです。

8.2.1 キューの作成

DBMS_AQADM.CREATE_QUEUE(
   queue_name          IN       VARCHAR2,
   queue_table         IN       VARCHAR2,
   queue_type          IN       BINARY_INTEGER DEFAULT NORMAL_QUEUE,
   max_retries         IN       NUMBER         DEFAULT NULL,
   retry_delay         IN       NUMBER         DEFAULT 0,
   retention_time      IN       NUMBER         DEFAULT 0,
   dependency_tracking IN       BOOLEAN        DEFAULT FALSE,
   comment             IN       VARCHAR2       DEFAULT NULL,

このプロシージャは、キューを作成します。パラメータは次のとおりです。

パラメータ 説明
queue_name この必須パラメータは、新しいキューの名前を指定します。

データベースが10.0互換の場合、キュー名には大文字および小文字を使用できます。ただし、キュー名は二重引用符で囲む必要があります。たとえば、abc.efgと指定すると、スキーマがABCで、名前がEFGであることを示しますが、"abc"."efg"と指定した場合は、スキーマがabc、名前がefgであることを意味します。

ユーザーが生成したキュー表名は、24文字より長くできません。長い名前のキューを作成しようとすると、エラーORA-24019が発生します。「その他の表およびキュー」にリストされているキュー名など、Oracle Streams AQで生成されたキュー名は、30文字より長くできません。

queue_table この必須パラメータは、キューが作成されるキュー表を指定します。
queue_type このパラメータは、作成されるキューのタイプを指定します。デフォルトのNORMAL_QUEUEは、通常のキューを作成します。EXCEPTION_QUEUEは、例外キューを生成します。
max_retries このパラメータは、メッセージに対するREMOVEモードのデキューの試行回数を制限します。max_retriesの最大値は2**31 -1です。
retry_delay このパラメータは、アプリケーションのロールバック後に、このメッセージの処理が再度スケジュールされる秒数を指定します。デフォルトは0(ゼロ)です。これは、メッセージができるかぎり早く再試行されることを意味します。max_retriesが0(ゼロ)に設定されている場合、このパラメータは無効です。

このパラメータは、シングル・コンシューマ・キューおよび8.1形式以上のマルチ・コンシューマ・キューではサポートされていますが、8.0形式のマルチ・コンシューマ・キュー(Oracle Streams AQ 10gリリース2(10.2)では廃止)ではサポートされていません。

retention_time このパラメータは、キューからデキューされた後、メッセージがキュー表内に保持される秒数を指定します。retention_timeが期限切れになると、メッセージはタイム・マネージャ・プロセスによって削除されます。INFINITEは、メッセージが永久に保持されることを意味します。デフォルトは0(ゼロ、保存なし)です。
dependency_tracking このパラメータは、将来の使用に備えて確保されています。FALSEがデフォルトです。このリリースでは、TRUEは使用できません。
comment このオプション・パラメータは、ユーザーが指定したキューの説明です。このユーザー・コメントは、キュー・カタログに追加されます。

すべてのキュー名は、スキーマ内において一意である必要があります。キューは、CREATE_QUEUEで作成した後、START_QUEUEをコールすると有効になります。デフォルトでは、キューはエンキューとデキューの両方を無効にして作成されます。保存されているメッセージを参照するには、メッセージIDによってデキューするか、またはSQLを使用します。GLOBAL_TOPIC_ENABLED = TRUEの場合は、キューが作成されると、対応するLDAPエントリも作成されます。

次の例(例8-23から例8-30)は、例8-1から例8-12で作成したデータ構造を使用しています。

例8-23 オブジェクト型メッセージのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name         =>  'test.obj_queue',
      queue_table        =>  'test.obj_qtab');
END;
/

例8-24 RAW型メッセージのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name          => 'test.raw_queue',
      queue_table         => 'test.raw_qtab');
END;
/

例8-25 LOB型メッセージのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name          => 'test.lob_queue',
      queue_table         => 'test.lob_qtab');
END;
/

例8-26 グループ化メッセージのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name          => 'test.group_queue',
      queue_table         => 'test.group_qtab');
END;
/

例8-27 優先メッセージのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name         => 'test.priority_queue',
      queue_table        => 'test.priority_qtab');
END;
/

例8-28 優先メッセージおよびマルチ・コンシューマのキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name         => 'test.multiconsumer_queue',
      queue_table        => 'test.multiconsumer_qtab');
END;
/

例8-29 伝播のデモ用のキューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name        => 'test.another_queue',
      queue_table       => 'test.multiconsumer_qtab');
END;
/

例8-30 マルチ・コンシューマの8.1形式キューの作成

BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name         => 'test.multiconsumer_81_queue',
      queue_table        => 'test.multiconsumer_81_qtab');
END;
/

8.2.2 キューの変更

DBMS_AQADM.ALTER_QUEUE(
   queue_name        IN    VARCHAR2,
   max_retries       IN    NUMBER   DEFAULT NULL,
   retry_delay       IN    NUMBER   DEFAULT NULL,
   retention_time    IN    NUMBER   DEFAULT NULL,
   comment           IN    VARCHAR2 DEFAULT NULL);

このプロシージャは、キューの既存のプロパティを変更します。

max_retriescommentretry_delayおよびretention_timeのみ変更できます。保存されているメッセージを参照するには、メッセージIDによってデキューするか、またはSQLを使用します。GLOBAL_TOPIC_ENABLED = TRUEの場合は、キューが変更されると、対応するLDAPエントリも変更されます。

例8-31は、保存時間を変更して、デキュー後1日間メッセージを保存します。

例8-31 保存時間の変更によるキューの変更

BEGIN
   DBMS_AQADM.ALTER_QUEUE(
      queue_name        => 'test.another_queue',
      retention_time    => 86400);
END;
/

8.2.3 キューの開始

DBMS_AQADM.START_QUEUE(
   queue_name      IN     VARCHAR2,
   enqueue         IN     BOOLEAN DEFAULT TRUE,
   dequeue         IN     BOOLEAN DEFAULT TRUE);

このプロシージャは、指定したキューに対するエンキューまたはデキューを有効にします。

管理者は、キューを作成した後、START_QUEUEを使用してそのキューを有効にする必要があります。デフォルトでは、エンキューおよびデキューの両方が有効になります。例外キューに対しては、デキュー操作のみが可能です。この操作は、コールが完了し、コールにトランザクションの特性がない場合にのみ有効になります。

例8-32 エンキューおよびデキューの両方を有効にしたキューの開始

BEGIN
   DBMS_AQADM.START_QUEUE (
      queue_name         => 'test.obj_queue');
END;
/

例8-33 デキューのみのキューの開始

BEGIN
   DBMS_AQADM.START_QUEUE(
      queue_name         => 'test.raw_queue',
      dequeue            => TRUE,
      enqueue            => FALSE);
END;
/

8.2.4 キューの停止

DBMS_AQADM.STOP_QUEUE(
   queue_name      IN   VARCHAR2,
   enqueue         IN   BOOLEAN DEFAULT TRUE,
   dequeue         IN   BOOLEAN DEFAULT TRUE,
   wait            IN   BOOLEAN DEFAULT TRUE);

このプロシージャは、指定したキューに対するエンキュー、デキューまたはその両方を無効にします。

デフォルトでは、このコールによってエンキューおよびデキューの両方が無効になります。キューは、未完了のトランザクションが存在する場合には停止できません。この操作は、コールが完了し、コールにトランザクションの特性がない場合にのみ有効になります。

例8-34 キューの停止

BEGIN
   DBMS_AQADM.STOP_QUEUE(
      queue_name        => 'test.obj_queue');
END;
/

8.2.5 キューの削除

DBMS_AQADM.DROP_QUEUE(
   queue_name        IN    VARCHAR2,

このプロシージャは、既存のキューを削除します。あらかじめSTOP_QUEUEがコールされ、キューがエンキューおよびデキューの両方に対して無効にされていないかぎり、DROP_QUEUEは許可されません。すべてのキュー・データは、削除操作の一部として削除されます。

GLOBAL_TOPIC_ENABLED = TRUEの場合は、キューが削除されると、対応するLDAPエントリも削除されます。

例8-35 標準キューの削除

BEGIN
   DBMS_AQADM.DROP_QUEUE(
      queue_name         => 'test.obj_queue');
END;
/

8.3 変換の管理

変換はメッセージのフォーマットを変更するため、あるアプリケーションによって作成されたメッセージを、別のアプリケーションで認識できます。永続メッセージとバッファ済メッセージの両方で変換を使用できます。

内容は次のとおりです。

8.3.1 変換の作成

DBMS_TRANSFORM.CREATE_TRANSFORMATION(
    schema               VARCHAR2(30),
    name                 VARCHAR2(30),
    from_schema          VARCHAR2(30),
    from_type            VARCHAR2(30),
    to_schema            VARCHAR2(30),
    to_type              VARCHAR2(30),
    transformation       VARCHAR2(4000));

このプロシージャは、メッセージ・フォーマットの変換を作成します。この変換は、from_type型の入力を持つSQLファンクションである必要があり、to_type型のオブジェクトを戻します。to_type型で、from_typeを参照するSQL式も使用できます。from_typeに対するすべての参照は、source.user_dataという形式である必要があります。

この機能を使用するには、dbms_transformに対するEXECUTE権限が必要です。この権限は、AQ_ADMINISTRATOR_ROLEに含まれています。


関連項目:

管理者およびユーザー・ロールの詳細は、「Oracle Streams AQセキュリティ」を参照してください。

また、変換のソース・タイプおよび宛先タイプであるユーザー定義型に対するEXECUTE権限、および変換ファンクションで使用するすべてのPL/SQLファンクションに対するEXECUTE権限も必要です。変換では、データベースの状態の書込み(DML操作の実行)、カレント・トランザクションのコミットまたはロールバックはできません。

例8-36 変換の作成

BEGIN
   DBMS_TRANSFORM.CREATE_TRANSFORMATION(
      schema         => 'test',
      name           => 'message_order_transform',
      from_schema    => 'test',
      from_type      => 'message_typ',
      to_schema      => 'test',
      to_type        => 'order_typ',
      transformation => 'test.order_typ(
         source.user_data.sender_id,
         source.user_data.subject,
         source.user_data.text)');
END;
/

8.3.2 変換の作成

DBMS_TRANSFORM.MODIFY_TRANSFORMATION(
    schema            VARCHAR2(30),
    name              VARCHAR2(30),
    attribute_number  INTEGER,
    transformation    VARCHAR2(4000));

このプロシージャは、変換ファンクションを変更して、ターゲット型の各属性ごとに変換を指定します。属性の番号が0(ゼロ)に指定された場合、変換式は単純にソース・タイプからターゲット型への変換を定義します。

from_typeに対するすべての参照は、source.user_dataという形式である必要があります。ソース・タイプの属性に対するすべての参照には、source.user_dataという接頭辞が付きます。

この機能を使用するには、dbms_transformに対するEXECUTE権限が必要です。また、変換のソース・タイプおよび宛先タイプであるユーザー定義型に対するEXECUTE権限、および変換ファンクションで使用するすべてのPL/SQLファンクションに対するEXECUTE権限も必要です。

8.3.3 変換の削除

DBMS_TRANSFORM.DROP_TRANSFORMATION (
    schema      VARCHAR2(30),
    name        VARCHAR2(30));

このプロシージャは、変換を削除します。

この機能を使用するには、dbms_transformに対するEXECUTE権限が必要です。また、変換のソース・タイプおよび宛先タイプであるユーザー定義型に対するEXECUTE権限、および変換ファンクションで使用するすべてのPL/SQLファンクションに対するEXECUTE権限も必要です。

8.4 権限の付与および取消し

内容は次のとおりです。

8.4.1 Oracle Streams AQシステム権限の付与

DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
   privilege         IN    VARCHAR2,
   grantee           IN    VARCHAR2,
   admin_option      IN    BOOLEAN := FALSE);

このプロシージャは、ユーザーおよびロールにOracle Streams AQシステム権限を付与します。権限は、ENQUEUE_ANYDEQUEUE_ANYおよびMANAGE_ANYです。最初は、SYSおよびSYSTEMのみがこのプロシージャを正常に使用できます。

ENQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADMコールを実行できます。

例8-37 AQシステム権限の付与

BEGIN
   DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
      privilege          =>    'ENQUEUE_ANY',
      grantee            =>    'test',
      admin_option       =>     FALSE);
   DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
      privilege          =>     'DEQUEUE_ANY',
      grantee            =>     'test',
      admin_option       =>      FALSE);
END;
/

8.4.2 Oracle Streams AQシステム権限の取消し

DBMS_AQADM.REVOKE_SYSTEM_PRIVILEGE(
   privilege         IN   VARCHAR2,
   grantee           IN   VARCHAR2);

このプロシージャは、ユーザーおよびロールからOracle Streams AQシステム権限を取り消します。権限は、ENQUEUE_ANYDEQUEUE_ANYおよびMANAGE_ANYです。システム権限のADMINオプションを選択的に取り消すことはできません。

ENQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADMコールを実行できます。

例8-38 AQシステム権限の取消し

BEGIN
   DBMS_AQADM.REVOKE_SYSTEM_PRIVILEGE(
      privilege          =>    'DEQUEUE_ANY',
      grantee            =>    'test');
END;
/

8.4.3 キュー権限の付与

DBMS_AQADM.GRANT_QUEUE_PRIVILEGE(
   privilege        IN    VARCHAR2,
   queue_name       IN    VARCHAR2,
   grantee          IN    VARCHAR2,
   grant_option     IN    BOOLEAN := FALSE);

このプロシージャは、ユーザーおよびロールにキューに関する権限を付与します。権限は、ENQUEUEDEQUEUEまたはALLです。最初は、キュー表の所有者のみがキューを付与するプロシージャを使用できます。


注意:

このプロシージャでは、キュー表の所有者(通常のキュー・ユーザー)にDBMS_AQADMEXECUTE権限を付与する必要があります。通常のキュー・ユーザーに対してキューおよびキュー表の作成と削除、サブスクライバの追加と削除などを許可しない場合は、初期のGRANT_QUEUE_PRIVILEGEの完了直後にEXECUTE権限を取り消す必要があります。

例8-39 キュー権限の付与

BEGIN
   DBMS_AQADM.GRANT_QUEUE_PRIVILEGE (
      privilege     =>     'ALL',
      queue_name    =>     'test.multiconsumer_81_queue',
      grantee       =>     'test_adm',
      grant_option  =>      TRUE);
END;
/

8.4.4 キュー権限の取消し

DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE (
   privilege         IN      VARCHAR2,
   queue_name        IN      VARCHAR2,
   grantee           IN      VARCHAR2);

このプロシージャは、ユーザーおよびロールからキューに関する権限を取り消します。この権限とは、ENQUEUEまたはDEQUEUEです。

権限の取消しを行うユーザーは、取消し対象となる権限の付与者である必要があります。GRANTオプションによって伝播された権限は、付与者の権限が取り消されたときに取り消されます。

例8-40に示すように、権限受領者から特定のキューに関するデキュー権限を取り消して、エンキュー権限のみを付与しておくこともできます。

例8-40 デキュー権限の取消し

BEGIN
   DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE(
      privilege     =>     'DEQUEUE',
      queue_name    =>     'test.multiconsumer_81_queue',
      grantee       =>     'test_adm');
END;

8.5 サブスクライバの管理

内容は次のとおりです。

8.5.1 サブスクライバの追加

DBMS_AQADM.ADD_SUBSCRIBER (
   queue_name     IN    VARCHAR2,
   subscriber     IN    sys.aq$_agent,
   rule           IN    VARCHAR2 DEFAULT NULL,
   transformation IN    VARCHAR2 DEFAULT NULL,
   queue_to_queue IN    BOOLEAN DEFAULT FALSE,
   delivery_mode  IN    PLS_INTEGER DEFAULT PERSISTENT);

このプロシージャは、デフォルトのサブスクライバをキューに追加します。

アプリケーションから特定の受信者リストまたはデフォルトのサブスクライバ・リストに、メッセージをエンキューできます。この操作は、マルチ・コンシューマに対応したキューに対してのみ実行できます。サブスクライバの合計数は、1024以下である必要があります。この操作はすぐに有効になり、この操作を含むトランザクションはコミットされます。このコールが完了した後に実行されるエンキュー・リクエストには、新しいアクションが反映されます。rule内の文字列はすべて、次のように一重引用符で囲む必要があります。

rule   => 'PRIORITY <= 3 AND CORRID =  ''FROM JAPAN'''

ユーザー・データ・プロパティまたは属性は、オブジェクト・ペイロードのみに適用され、常に接頭辞としてtab.userdataを付ける必要があります。

GLOBAL_TOPIC_ENABLEDがTRUEの場合は、サブスクライバが作成されると、対応するLDAPエントリも作成されます。

デキューまたは伝播中に適用する変換の名前を指定します。変換は、DBMS_TRANSFORMパッケージを使用して作成します。


関連項目:

DBMS_TRANSFORMパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

XMLType属性を持つペイロードを含むキューに対しては、XMLType.existsNode()メソッドおよびXMLType.extract()メソッドを含むルールを指定できます。

パラメータqueue_to_queueTRUEに設定されている場合、追加されたサブスクライバは、キューからキューへのサブスクライバです。ソース・キューと宛先キューの間にキューからキューへの伝播が設定されている場合、キューからキューへのサブスクライバは、その伝播スケジュールによってメッセージを受信します。

delivery_modeパラメータがデフォルトのPERSISTENTの場合、サブスクライバは永続メッセージのみを受信します。BUFFEREDに設定されている場合、サブスクライバはバッファ済メッセージのみを受信します。PERSISTENT_OR_BUFFEREDに設定されている場合、サブスクライバは両方のタイプを受信します。ALTER_SUBSCRIBERを使用してこのパラメータを変更することはできません。

宛先キューがシングル・コンシューマ・キューの場合、エージェント名は、NULLである必要があります。


注意:

ADD_SUBSCRIBERは、キューに対する管理操作です。Oracle Streams AQによって、アプリケーションの管理コールおよび操作コールの同時発行が阻止されることはありませんが、これらコールは順次発行されます。メッセージをエンキューまたはデキューする保留中のコールが完了するまで、ADD_SUBSCRIBERがブロックします。これは、保留中のトランザクションが完了するまで待機しません。

例8-41 データベース・リンクの指定されたキューでのサブスクライバの追加

DECLARE
   subscriber          sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent('subscriber1', 'test2.msg_queue2@london', null);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name         => 'test.multiconsumer_81_queue',
      subscriber         =>  subscriber);
END;
/

例8-42 データベース・リンクへのサブスクライバとしてのシングル・コンシューマ・キューの追加

DECLARE
   subscriber          sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent('subscriber1', 'test2.msg_queue2@london', null);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name         => 'test.multiconsumer_81_queue',
      subscriber         =>  subscriber);
END;
/

例8-43 ルールを使用したサブスクライバの追加

DECLARE
   subscriber       sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent('subscriber2', 'test2.msg_queue2@london', null);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name =>  'test.multiconsumer_81_queue',
      subscriber =>   subscriber,
      rule       =>  'priority < 2');
END;
/

例8-44 サブスクライバの追加と変換の指定

DECLARE
   subscriber       sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent('subscriber3', 'test2.msg_queue2@london', null);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name     => 'test.multiconsumer_81_queue',
      subscriber     =>  subscriber,
      transformation => 'test.message_order_transform');
END;
/

例8-45 マルチ・コンシューマ・キューからシングル・コンシューマ・キューへの伝播

DECLARE
   subscriber          SYS.AQ$_AGENT;
BEGIN
  subscriber := SYS.AQ$_AGENT(NULL, 'test2.single_consumer__queue@london',
null);
  DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name         => 'test.multiconsumer_81_queue',
      subscriber         =>  subscriber);
END;

8.5.2 サブスクライバの変更

DBMS_AQADM.ALTER_SUBSCRIBER (
   queue_name     IN    VARCHAR2,
   subscriber     IN    sys.aq$_agent,
   rule           IN    VARCHAR2
   transformation IN    VARCHAR2);

このプロシージャは、指定されたキューのサブスクライバの既存のプロパティを変更します。

ルールまたは変換(あるいはその両方)を変更できます。これらの属性のいずれか1つのみを変更する場合は、他の属性の既存の値を変更コールに指定します。GLOBAL_TOPIC_ENABLED = TRUEの場合は、サブスクライバが変更されると、対応するLDAPエントリが作成されます。

例8-46 サブスクライバ・ルールの変更

DECLARE
   subscriber       sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent('subscriber2', 'test2.msg_queue2@london', null);
   DBMS_AQADM.ALTER_SUBSCRIBER(
      queue_name => 'test.multiconsumer_81_queue',
      subscriber =>  subscriber,
      rule       => 'priority = 1');
END;
/

8.5.3 サブスクライバの削除

DBMS_AQADM.REMOVE_SUBSCRIBER (
   queue_name         IN         VARCHAR2,
   subscriber         IN         sys.aq$_agent);

このプロシージャは、デフォルトのサブスクライバをキューから削除します。

この操作はすぐに有効になり、この操作を含むトランザクションはコミットされます。既存メッセージ内のこのサブスクライバに対するすべての参照は、操作の一部として削除されます。GLOBAL_TOPIC_ENABLED = TRUEの場合は、サブスクライバが削除されると、対応するLDAPエントリも削除されます。

そのコンシューマがデキューできるが保留しているメッセージがあるときに、REMOVE_SUBSCRIBERプロシージャを実行してもエラーにはなりません。このメッセージは、REMOVE_SUBSCRIBERプロシージャが完了すると自動的にデキュー不可になります。


注意:

REMOVE_SUBSCRIBERは、キューに対する管理操作です。Oracle Streams AQによって、アプリケーションの管理コールおよび操作コールの同時発行が阻止されることはありませんが、これらコールは順次発行されます。メッセージをエンキューまたはデキューする保留中のコールが完了するまで、REMOVE_SUBSCRIBERがブロックします。これは、保留中のトランザクションが完了するまで待機しません。

例8-47 サブスクライバの削除

DECLARE
   subscriber       sys.aq$_agent;
BEGIN
   subscriber := sys.aq$_agent ('subscriber2', 'test2.msg_queue2@london', null);
   DBMS_AQADM.REMOVE_SUBSCRIBER(
      queue_name => 'test.multiconsumer_81_queue',
      subscriber => subscriber);
END;
/

8.6 伝播の管理

あるキューに定義された伝播スケジュールは、そのキューの有効期間中いつでも変更または削除できます。スケジュールを削除するかわりに一時的に使用不可にすることもできます。すべての管理コールは、スケジュールがアクティブかどうかに関係なく実行されます。スケジュールがアクティブの場合、コールが処理されるまでに数秒かかります。

内容は次のとおりです。

8.6.1 キューの伝播のスケジューリング

DBMS_AQADM.SCHEDULE_PROPAGATION (
   queue_name         IN  VARCHAR2,
   destination        IN  VARCHAR2 DEFAULT NULL,
   start_time         IN  DATE     DEFAULT SYSDATE,
   duration           IN  NUMBER   DEFAULT NULL,
   next_time          IN  VARCHAR2 DEFAULT NULL,
   latency            IN  NUMBER   DEFAULT 60,
   destination_queue  IN  VARCHAR2 DEFAULT NULL);

このプロシージャは、メッセージの伝播をスケジュールします。

宛先は、destinationパラメータのデータベース・リンクまたはdestination_queueパラメータのキュー名、あるいはその両方によって識別されます。データベース・リンクのみを指定すると、キューからdblinkへの伝播が行われます。別のデータベースにある複数のキューにメッセージを伝播する場合、すべての伝播が同じ頻度で行われます。

キュー表所有者のスキーマ内のプライベート・データベース・リンクが、パブリック・データベース・リンクと同じ名前の場合、AQは常にプライベート・データベース・リンクを使用します。

宛先キュー名を指定すると、キューからキューへの伝播が行われる機能が、Oracle Streams AQ 10gリリース2(10.2)で導入されました。別のデータベース内の複数のキューにメッセージを伝播すると、キューからキューへの伝播により、各スケジュールを独立して構成できます。個別の伝播を有効化または無効化できます。


注意:

あるキューから別のデータベース内のキューへの伝播が必要な場合は、パラメータdestinationおよびdestination_queueを指定する必要があります。

キューからキューへの伝播モードは、宛先Real Application Clusters(RAC)システムに伝播する場合、透過的なフェイルオーバーをサポートします。キューからキューへの伝播では、RACでキューの所有者インスタンスが失敗した場合、データベース・リンクを再指定する必要がありません。

宛先にNULLを指定すると、メッセージを同じデータベース内の他のキューにも伝播できます。同じ宛先に複数の受信者を持つ場合、(キューが同じかどうかにかかわらず)メッセージは、すべての受信者に同時に伝播されます。

ソース・キューは、マルチ・コンシューマ向けのキュー表内に存在する必要があります。シングル・コンシューマ・キューを指定すると、エラーORA-24039が発生します。キューまたはデータベース・リンクを参照する場合、Oracle Streams AQはシノニムの使用をサポートしていません。

伝播をnext_timeおよびdurationに指定すると、伝播は指定された期間、周期的に実行されます。待機時間ゼロ(0)をnext_timeまたはduration以外に指定すると、伝播は永続的に実行され、メッセージがキューに発生するとメッセージを伝播し、発生しない場合はアイドル状態になります。ゼロ(0)以外の待機時間をnext_timeまたはduration(デフォルト)以外に指定すると、伝播スケジュールはイベント・ベースで実行されます。キューに伝播するメッセージがある場合に実行するようにスケジュールされます。システム定義の期間内にメッセージがない場合、伝播する新しいメッセージが発生するまでジョブは実行を停止します。ジョブが実際に実行する時間は、準備ジョブの数やジョブ・キュー・プロセスの数など、他の要因に依存します。


関連項目:


伝播は線形バックオフ・スキームを使用して、障害が発生したスケジュールからの伝播を再試行します。あるスケジュールで続けて障害が発生したときは、最初の再試行は30秒後、次の再試行は60秒後、3回目の再試行は120秒後、というように続きます。再試行時間が現行の伝播枠の期限切れ時刻を超える場合は、次の再試行は、次の伝播枠の開始時刻に行われます。最大16回の再試行が行われた後、そのスケジュールは自動的に使用不可能になります。


注意:

再試行が次の伝播枠にずれ込むと、常にずれ込むようになります。再試行スケジュールは指数バックオフ・スキームでは制御されなくなります。DBMS_AQADM.SCHEDULE_PROPAGATION()next_timeパラメータに指定した日付関数により伝播枠間の間隔が短くなると、再試行の失敗回数がすぐに16を超えてスケジュールが使用不可になります。

存在しないdestinationの値を指定すると、このプロシージャはエラーをスローせずに実行します。USER_QUEUE_SCHEDULESビューのLAST_ERROR_MSG列で、ランタイム伝播エラーを問い合せることができます。

例8-48 同じデータベース内のキューへの伝播のスケジューリング

BEGIN
   DBMS_AQADM.SCHEDULE_PROPAGATION(
      queue_name    =>    'test.multiconsumer_queue');
END;
/

例8-49 他のデータベース内のキューへの伝播のスケジューリング

BEGIN
   DBMS_AQADM.SCHEDULE_PROPAGATION(
      queue_name    =>    'test.multiconsumer_queue',
      destination   =>    'another_db.world');
END;
/

例8-50 キューからキューへの伝播のスケジューリング

BEGIN
   DBMS_AQADM.SCHEDULE_PROPAGATION(
      queue_name         =>    'test.multiconsumer_queue',
      destination        =>    'another_db.world'
      destination_queue  =>    'target_queue');
END;
/

8.6.2 伝播キュー・タイプの検証

DBMS_AQADM.VERIFY_QUEUE_TYPES(
   src_queue_name    IN    VARCHAR2,
   dest_queue_name   IN    VARCHAR2,
   destination       IN    VARCHAR2 DEFAULT NULL,
   rc                OUT   BINARY_INTEGER);

このプロシージャは、ソース・キューおよび宛先キューが同じ型を持っているかどうかを検証します。検証の結果は、ディクショナリ表SYS.AQ$_MESSAGE_TYPES表に格納され、以前にこのコマンドから出力されたすべての結果は上書きされます。

ソースおよび宛先に同じ型のキューがない場合に指定された変換では、ソース・キュー・タイプを宛先キュー・タイプにマップする必要があります。


注意:

SYS.AQ$_MESSAGE_TYPESは、同じソース・キュー、宛先キューおよびデータベース・リンクに対して複数のエントリを持ちますが、変換は異なります。

例8-51 キュー・タイプの検証

SET SERVEROUTPUT ON
DECLARE
rc      BINARY_INTEGER;
BEGIN
   DBMS_AQADM.VERIFY_QUEUE_TYPES(
      src_queue_name  => 'test.multiconsumer_queue',
      dest_queue_name => 'test.another_queue',
      rc              =>  rc);
   DBMS_OUTPUT.PUT_LINE('Compatible: '||rc);
END;
/

例8-51には、同じタイプの2つのキューが含まれます。戻り値は次のとおりです。

VQT: new style queue
Compatible: 1

test.another_queueのかわりにtest.raw_queue(RAW型のキュー)を使用して同じ例を実行すると、この例は次の行を戻します。

VQT: new style queue
Compatible: 0

8.6.3 伝播スケジュールの変更

DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE(
   queue_name         IN  VARCHAR2,
   destination        IN  VARCHAR2 DEFAULT NULL,
   duration           IN  NUMBER   DEFAULT NULL,
   next_time          IN  VARCHAR2 DEFAULT NULL,
   latency            IN  NUMBER   DEFAULT 60,
   destination_queue  IN  VARCHAR2 DEFAULT NULL);

このプロシージャは、伝播スケジュールのパラメータを変更します。キューからキューへの伝播のdestination_queueパラメータは変更できません。

例8-52 同じデータベース内のキューへの伝播スケジュールの変更

BEGIN
   DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE(
      queue_name    =>    'test.multiconsumer_queue',
      duration      =>    '2000',
      next_time     =>    'SYSDATE + 3600/86400',
      latency       =>    '32');
END;
/

例8-53 他のデータベース内のキューへの伝播スケジュールの変更

BEGIN
   DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE(
      queue_name    =>    'test.multiconsumer_queue',
      destination   =>    'another_db.world',
      duration      =>    '2000',
      next_time     =>    'SYSDATE + 3600/86400',
      latency       =>    '32');
END;
/

8.6.4 伝播スケジュールの有効化

DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE(
   queue_name        IN   VARCHAR2,
   destination       IN   VARCHAR2 DEFAULT NULL,
   destination_queue IN   VARCHAR2 DEFAULT NULL);

このプロシージャは、以前に無効化した伝播スケジュールを有効化します。

例8-54 同じデータベース内のキューへの伝播の有効化

BEGIN
   DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE(
      queue_name   =>   'test.multiconsumer_queue');
END;
/

例8-55 他のデータベース内のキューへの伝播の有効化

BEGIN
   DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE(
      queue_name    =>    'test.multiconsumer_queue',
      destination   =>    'another_db.world');
END;
/

8.6.5 伝播スケジュールの無効化

DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE(
   queue_name        IN   VARCHAR2,
   destination       IN   VARCHAR2 DEFAULT NULL,
   destination_queue IN   VARCHAR2 DEFAULT NULL);

このプロシージャは、以前に有効化した伝播スケジュールを無効化します。

例8-56 同じデータベース内のキューへの伝播の無効化

BEGIN
   DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE(
      queue_name   =>   'test.multiconsumer_queue');
END;
/

例8-57 他のデータベース内のキューへの伝播の無効化

BEGIN
   DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE(
      queue_name    =>    'test.multiconsumer_queue',
      destination   =>    'another_db.world');
END;
/

8.6.6 伝播スケジュールの解除

DBMS_AQADM.UNSCHEDULE_PROPAGATION (
   queue_name        IN  VARCHAR2,
   destination       IN  VARCHAR2 DEFAULT NULL,
   destination_queue IN  VARCHAR2 DEFAULT NULL);

このプロシージャは、以前にスケジュールした、あるキューから宛先へのメッセージ伝播のスケジュールを解除します。宛先は、destinationパラメータの特定のデータベース・リンク、またはdestination_queueパラメータの名前によって識別されます。

例8-58 同じデータベース内のキューへの伝播スケジュールの解除

BEGIN
   DBMS_AQADM.UNSCHEDULE_PROPAGATION(
      queue_name => 'test.multiconsumer_queue');
END;
/

例8-59 他のデータベース内のキューへの伝播スケジュールの解除

BEGIN
   DBMS_AQADM.UNSCHEDULE_PROPAGATION(
      queue_name    =>   'test.multiconsumer_queue',
      destination   =>   'another_db.world');
END;
/

8.7 Oracle Streams AQエージェントの管理

内容は次のとおりです。

8.7.1 Oracle Streams AQエージェントの作成

DBMS_AQADM.CREATE_AQ_AGENT (
  agent_name                IN VARCHAR2,
  certificate_location      IN VARCHAR2 DEFAULT NULL,
  enable_http               IN BOOLEAN DEFAULT FALSE,
  enable_anyp               IN BOOLEAN DEFAULT FALSE);

このプロシージャは、HTTPプロトコルを使用して、Oracle Streams AQインターネット・アクセスのためのエージェントを登録します。

SYS.AQ$INTERNET_USERSビューには、すべてのOracle Streams AQインターネット・エージェントのリストが表示されます。エージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。

  • GLOBAL_TOPIC_ENABLED = TRUE

  • certificate_locationが指定されている

8.7.2 Oracle Streams AQエージェントの変更

DBMS_AQADM.ALTER_AQ_AGENT (
  agent_name                IN VARCHAR2,
  certificate_location      IN VARCHAR2 DEFAULT NULL,
  enable_http               IN BOOLEAN DEFAULT FALSE,
  enable_anyp               IN BOOLEAN DEFAULT FALSE);

このプロシージャは、Oracle Streams AQインターネット・アクセスに登録されたエージェントを変更します。

Oracle Streams AQエージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。

  • GLOBAL_TOPIC_ENABLED = TRUE

  • certificate_locationが指定されている

8.7.3 Oracle Streams AQエージェントの削除

DBMS_AQADM.DROP_AQ_AGENT (
  agent_name     IN VARCHAR2);

このプロシージャは、以前にOracle Streams AQインターネット・アクセスに登録されたエージェントを削除します。

Oracle Streams AQエージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。

  • GLOBAL_TOPIC_ENABLED = TRUE

  • certificate_locationが指定されている

8.7.4 データベース・アクセスの許可

DBMS_AQADM.ENABLE_DB_ACCESS (
  agent_name                IN VARCHAR2,
  db_username               IN VARCHAR2)

このプロシージャは、Oracle Streams AQインターネット・エージェントに特定のデータベース・ユーザーの権限を付与します。このエージェントは、CREATE_AQ_AGENTプロシージャを使用して事前に作成されています。

SYS.AQ$INTERNET_USERSビューには、すべてのOracle Streams AQインターネット・エージェント、および権限が付与されているデータベース・ユーザーの名前のリストが表示されます。


関連項目:

保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。

8.7.5 データベース・アクセスの禁止

DBMS_AQADM.DISABLE_DB_ACCESS (
  agent_name                IN VARCHAR2,
  db_username               IN VARCHAR2)

このプロシージャは、Oracle Streams AQインターネット・エージェントから特定のデータベース・ユーザーの権限を取り消します。これらの権限は、ENABLE_DB_ACCESSプロシージャを使用して事前にエージェントに付与されています。


関連項目:

保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。

8.8 LDAPサーバーへの別名の追加

DBMS_AQADM.ADD_ALIAS_TO_LDAP(
   alias          IN VARCHAR2,
   obj_location   IN VARCHAR2);

このプロシージャは、LDAPサーバーに別名を追加します。

このコールは、LDAPのOracle Streams AQオブジェクトの別名および識別名を使用して、Oracle Streams AQオブジェクトを指す別名を作成します。この別名は、データベース・サーバーの識別名の直下に配置されます。別名が指すオブジェクトは、キュー、エージェントまたはConnectionFactoryです。


関連項目:

保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。

8.9 LDAPサーバーからの別名の削除

DBMS_AQADM.DEL_ALIAS_FROM_LDAP(
   alias IN VARCHAR2);

このプロシージャは、LDAPサーバーから別名を削除します。

このコールは、引数に別名を使用して、LDAPサーバー内の別名エントリを削除します。別名は、LDAPディレクトリのデータベース・サーバーの直下に配置されているとします。