165 DBMS_STREAMS_HANDLER_ADM

DBMS_STREAMS_HANDLER_ADMパッケージは、Oracle Streamsパッケージの1つであり、文DMLハンドラを管理するインタフェースを提供します。

この章のトピックは、次のとおりです:

165.1 DBMS_STREAMS_HANDLER_ADMの概要

文DMLハンドラは、適用プロセスでデキューされた行論理変更レコード(行LCR)に対して、1つ以上のデータ操作言語(DML)文を実行します。

単一の文DMLハンドラに複数の文を含めることができ、それらの文の実行順序は制御できます。

文DMLハンドラは、適用プロセスのプロシージャDMLハンドラに類似しています。文DMLハンドラとプロシージャDMLハンドラはどちらも、行LCRにカプセル化されている行変更のカスタム処理を提供します。また、文DMLハンドラとプロシージャDMLハンドラはどちらも、適用プロセスが行LCRをデキューするときに実行されます。ただし、プロシージャDMLハンドラに対して、文DMLハンドラには次のような利点があります。

  • 文DMLハンドラはPL/SQL処理を必要としないため、一般的に、プロシージャDMLハンドラよりもパフォーマンスが優れています。

  • 文DMLハンドラの構文はDML構文と同じです。文DMLハンドラはPL/SQLプログラミングを必要としません。プロシージャDMLハンドラの場合は、PL/SQLプログラミングが必要です。

  • 文DMLハンドラでは、行LCRの情報にアクセスするためにANYDATAの値を操作する必要はありません。通常、プロシージャDMLハンドラではANYDATAの値の操作が必要です。

  • 文DMLハンドラは、同じデータベース・オブジェクトへの同じ操作に対して、エラー・ハンドラと共存できます。一方、同じデータベース・オブジェクトへの同じ操作に対して、プロシージャDMLハンドラとエラー・ハンドラの両方を指定することはできません。

ノート:

同じデータベース・オブジェクトへの同じ操作に対して、複数の文DMLハンドラを指定できます。その場合、任意の順序で文DMLハンドラを実行でき、各文DMLハンドラは、適用プロセスでデキューされた元の行LCRのコピーを受け取ることができます。

165.2 DBMS_STREAMS_HANDLER_ADMのセキュリティ・モデル

このパッケージのセキュリティは、選択したユーザーまたはロールにこのパッケージのEXECUTE権限を付与するか、選択したユーザーまたはロールにEXECUTE_CATALOG_ROLEを付与することで制御できます。

パッケージのサブプログラムをストアド・プロシージャ内から実行する場合、そのサブプログラムを実行するユーザーには、パッケージのEXECUTE権限を直接付与する必要があります。ロールを通して付与することはできません。

このパッケージ内のサブプログラムを実行するユーザーが必要な権限を所有するには、Oracle Streams管理者を構成し、このパッケージを使用するときにOracle Streams管理者として接続します。

参照:

Oracle Streams管理者の構成の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

165.3 DBMS_STREAMS_HANDLER_ADMのビュー

DBMS_STREAMS_HANDLER_ADMパッケージでは、次のビューを使用します。

  • DBA_APPLY_DML_HANDLERS

  • DBA_STREAMS_STMTS

  • DBA_STREAMS_STMT_HANDLERS

これらについては、『Oracle Databaseリファレンス』に詳しく説明されています。

165.4 DBMS_STREAMS_HANDLER_ADMの操作上のノート

この項では、DBMS_STREAMS_HANDLER_ADMパッケージの操作上のノートについて説明します。

文の実行順序

文DMLハンドラの各文には、固有の実行順序番号が付いています。文DMLハンドラが呼び出されると、文は実行順序番号の小さいものから大きいものへと進める順序で実行されます。

サポートされているSQL文

文DMLハンドラは、行論理変更レコード(行LCR)に対する任意の有効なDML操作に使用できます。たとえば、文DMLハンドラは表に加えられたDML変更を監査できます。

文DMLハンドラでは、次のSQL文がサポートされています。

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

なお、文DMLハンドラのSQL文では定義変数をサポートしていません。

ただし、文DMLハンドラのSQL文には、行LCRタイプ(LCR$_ROW_RECORD)に対するメンバー・サブプログラムのコールを含めることができます(ADD_COLUMNDELETE_COLUMNKEEP_COLUMNSおよびRENAME_COLUMNなど)。

ノート:

文DMLハンドラは、行LCRの列の値を変更できません。

サポートされている行LCRの列属性

文DMLハンドラの文には、次の表に示す、行LCRの列属性を含めることができます。

表165-1 行LCRの列属性

属性 説明

new

行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性は古い値を戻します。

new_exists

行LCRに新しい列の値が存在する場合は、TRUEを戻します。

行LCRに新しい列の値が存在しない場合は、FALSEを戻します。

new_only

行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性はNULLを戻し、古い値を戻しません。

old

行LCRの古い列の値を戻します。

old_exists

行LCRに古い列の値が存在する場合は、TRUEを戻します。

行LCRに古い列の値が存在しない場合は、FALSEを戻します。

次の方法で文に属性を指定します。

:attribute.column_name

たとえば、salary列に対してnew_only属性を指定する場合は、文に次のように入力します。

:new_only.salary

サポートされている行LCRの属性

文DMLハンドラの文には、次の表に示す、行LCRの属性を含めることができます。

表165-2 行LCRの属性

属性 説明

command_type

変更を行ったDML文のタイプ(INSERTUPDATEまたはDELETE)を戻します。DBMS_LOBピース単位のLOB操作は、文DMLハンドラではサポートされていません。

commit_scn

LCRが属するトランザクションのコミットSCN(システム変更番号)を戻します。

compatible

LCRのサポートに最小限必要なデータベース互換性を戻します。

instance_number

LCRにカプセル化されている変更を行ったデータベース・インスタンスのインスタンス番号を戻します。通常、インスタンス数はOracle Real Application Clusters(Oracle RAC)の構成に関連する。

object_owner

変更された行がある表を含むスキーマ名を戻します。

object_name

変更された行がある表の名前を戻します。

scn

変更が行われた時点のSCNを戻します。

source_database_name

行の変更が発生したソース・データベースの名前を戻します。

source_time

取得プロセスで取得されたLCRの変更がソース・データベースのREDOログで生成された時刻、または永続LCRが作成された時刻を戻します。

tag

LCRの追跡に使用可能なRAWタグを戻します。

transaction_id

DML文が実行されたトランザクションの識別子を戻します。

次の方法で文に属性を指定します。

:attribute_name

たとえば、行LCRにsource_database_name属性を指定する場合は、文に次のように入力します。

:source_database_name

サポートされている行LCRの追加属性

文DMLハンドラの文には、次の表に示す、行LCRの追加属性を含めることができます。

表165-3 行LCRの追加属性

属性 説明

row_id

行LCRで変更された行のROWIDを戻します。

serial#

LCRに取得された変更を実行したセッションのシリアル番号を戻します。

session#

LCRに取得された変更を実行したセッションの識別子を戻します。

thread#

LCRに取得された変更が実行されたインスタンスのスレッド番号を戻します。通常、スレッド番号はOracle RAC構成でのみ使用されます。

tx_name

LCRが属するトランザクションの名前を戻します。

username

LCRに取得された変更を実行した現行のユーザーの名前を戻します。

次の方法で文に属性を指定します。

:extra_attribute.attribute_name

たとえば、行LCRにrow_id追加属性を指定する場合は、文に次のように入力します。

:extra_attribute.row_id

サポートされている行LCRのメソッド

文DMLハンドラの文には、行LCRに対するEXECUTEメンバー・プロシージャのコールを含めることができます。EXECUTEメンバー・プロシージャは、現行ユーザーのセキュリティ・ドメイン下で行LCRを実行します。

EXECUTEメンバー・プロシージャを実行する文は、文DMLハンドラの何番目の実行順序番号に配置することもできます。行LCRは、文DMLハンドラ内のその他のSQL文実行以外に、行LCRの変更を特定の表に適用する場合以外は実行する必要はありません。

文でEXECUTEメンバー・プロシージャをコールする場合は、LCRの実行によって生じた競合の解消に対して、DBMS_APPLY_ADMパッケージのSET_UPDATE_CONFLICT_HANDLERプロシージャで表に定義した競合解消を使用するかどうかを、conflict_resolutionパラメータによって制御します。

:lcr.execute TRUE|FALSE

引数TRUEは、競合解消を使用することを示します。引数FALSEは、競合解消を使用しないことを示します。

たとえば、競合解消を使用するには、文に次のように入力します。

:lcr.execute TRUE

このパラメータが指定されていない場合またはNULLに設定されている場合は、エラーが発生します。

165.5 DBMS_STREAMS_HANDLER_ADMサブプログラムの要約

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

表165-4 DBMS_STREAMS_HANDLER_ADMパッケージのサブプログラム

サブプログラム 説明

ADD_STMT_TO_HANDLERプロシージャ

文DMLハンドラに文を追加します。

CREATE_STMT_HANDLERプロシージャ

文DMLハンドラを作成します。

DROP_STMT_HANDLERプロシージャ

文DMLハンドラを削除します。

REMOVE_STMT_FROM_HANDLERプロシージャ

文DMLハンドラから文を削除します。

ノート:

このパッケージのサブプログラムはコミットしません。

165.5.1 ADD_STMT_TO_HANDLERプロシージャ

このプロシージャは、文DMLハンドラに文を追加します。

構文

DBMS_STREAMS_HANDLER_ADM.ADD_STMT_TO_HANDLER(
   handler_name       IN VARCHAR2,  
   statement          IN CLOB,   
   execution_sequence IN NUMBER  DEFAULT NULL);

パラメータ

表165-5 ADD_STMT_TO_HANDLERプロシージャのパラメータ

パラメータ 説明

handler_name

文DMLハンドラの名前。

statement

文DMLハンドラに追加するSQL文のテキスト。

NULLの場合は、エラーが発生します。

execution_sequence

SQL文の実行順序を設定するための、文DMLハンドラにおける文の順位。文は、最も小さい実行順序番号から最も大きい実行順序番号へと実行されます。

正の整数、負の整数、小数を指定できます。また、0(ゼロ)を指定することもできます。

文DMLハンドラ内の既存の文で使用されている実行順序番号を指定すると、statementパラメータ内の文がその既存の文に置き換わります。

NULLの場合は、文DMLハンドラに文と実行順序番号が追加されます。この順序番号は、文DMLハンドラのすべての文の実行順序番号よりも大きな番号です。

165.5.2 CREATE_STMT_HANDLERプロシージャ

このプロシージャは、文DMLハンドラを作成します。

構文

DBMS_STREAMS_HANDLER_ADM.CREATE_STMT_HANDLER(
   handler_name IN VARCHAR2,  
   comment      IN VARCHAR2  DEFAULT NULL);

パラメータ

表165-6 CREATE_STMT_HANDLERプロシージャのパラメータ

パラメータ 説明

handler_name

文DMLハンドラの名前。

comment

文DMLハンドラのコメント。

NULLの場合、文DMLハンドラに対するコメントは記録されません。

165.5.3 DROP_STMT_HANDLERプロシージャ

このプロシージャは、文DMLハンドラを削除します。

構文

DBMS_STREAMS_HANDLER_ADM.DROP_STMT_HANDLER(
   handler_name IN VARCHAR2);  

パラメータ

表165-7 DROP_STMT_HANDLERプロシージャのパラメータ

パラメータ 説明

handler_name

文DMLハンドラの名前。

165.5.4 REMOVE_STMT_FROM_HANDLERプロシージャ

このプロシージャは、文DMLハンドラから文を削除します。

構文

DBMS_STREAMS_HANDLER_ADM.REMOVE_STMT_FROM_HANDLER(
   handler_name       IN VARCHAR2,  
   execution_sequence IN NUMBER  DEFAULT NULL);

パラメータ

表165-8 REMOVE_STMT_FROM_HANDLERプロシージャのパラメータ

パラメータ 説明

handler_name

文DMLハンドラの名前。

execution_sequence

削除する文の順位。

正の整数、負の整数、小数を指定できます。また、0(ゼロ)を指定することもできます。

NULLの場合、プロシージャは文DMLハンドラの最後の文を削除します。

指定した実行順序番号が文DMLハンドラに存在しない場合は、エラーが発生します。