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_COLUMN
、DELETE_COLUMN
、KEEP_COLUMNS
およびRENAME_COLUMN
など)。
ノート:
文DMLハンドラは、行LCRの列の値を変更できません。
サポートされている行LCRの列属性
文DMLハンドラの文には、次の表に示す、行LCRの列属性を含めることができます。
表165-1 行LCRの列属性
属性 | 説明 |
---|---|
|
行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性は古い値を戻します。 |
|
行LCRに新しい列の値が存在する場合は、 行LCRに新しい列の値が存在しない場合は、 |
|
行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性は |
|
行LCRの古い列の値を戻します。 |
|
行LCRに古い列の値が存在する場合は、 行LCRに古い列の値が存在しない場合は、 |
次の方法で文に属性を指定します。
:attribute.column_name
たとえば、salary
列に対してnew_only
属性を指定する場合は、文に次のように入力します。
:new_only.salary
サポートされている行LCRの属性
文DMLハンドラの文には、次の表に示す、行LCRの属性を含めることができます。
表165-2 行LCRの属性
属性 | 説明 |
---|---|
|
変更を行ったDML文のタイプ( |
|
LCRが属するトランザクションのコミットSCN(システム変更番号)を戻します。 |
|
LCRのサポートに最小限必要なデータベース互換性を戻します。 |
|
LCRにカプセル化されている変更を行ったデータベース・インスタンスのインスタンス番号を戻します。通常、インスタンス数はOracle Real Application Clusters(Oracle RAC)の構成に関連する。 |
|
変更された行がある表を含むスキーマ名を戻します。 |
|
変更された行がある表の名前を戻します。 |
|
変更が行われた時点のSCNを戻します。 |
|
行の変更が発生したソース・データベースの名前を戻します。 |
|
取得プロセスで取得されたLCRの変更がソース・データベースのREDOログで生成された時刻、または永続LCRが作成された時刻を戻します。 |
|
LCRの追跡に使用可能なRAWタグを戻します。 |
|
DML文が実行されたトランザクションの識別子を戻します。 |
次の方法で文に属性を指定します。
:attribute_name
たとえば、行LCRにsource_database_name
属性を指定する場合は、文に次のように入力します。
:source_database_name
サポートされている行LCRの追加属性
文DMLハンドラの文には、次の表に示す、行LCRの追加属性を含めることができます。
表165-3 行LCRの追加属性
属性 | 説明 |
---|---|
|
行LCRで変更された行のROWIDを戻します。 |
|
LCRに取得された変更を実行したセッションのシリアル番号を戻します。 |
|
LCRに取得された変更を実行したセッションの識別子を戻します。 |
|
LCRに取得された変更が実行されたインスタンスのスレッド番号を戻します。通常、スレッド番号はOracle RAC構成でのみ使用されます。 |
|
LCRが属するトランザクションの名前を戻します。 |
|
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パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
文DMLハンドラに文を追加します。 |
|
文DMLハンドラを作成します。 |
|
文DMLハンドラを削除します。 |
|
文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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
文DMLハンドラの名前。 |
|
文DMLハンドラに追加するSQL文のテキスト。
|
|
SQL文の実行順序を設定するための、文DMLハンドラにおける文の順位。文は、最も小さい実行順序番号から最も大きい実行順序番号へと実行されます。 正の整数、負の整数、小数を指定できます。また、0(ゼロ)を指定することもできます。 文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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
文DMLハンドラの名前。 |
|
文DMLハンドラのコメント。
|
165.5.3 DROP_STMT_HANDLERプロシージャ
このプロシージャは、文DMLハンドラを削除します。
構文
DBMS_STREAMS_HANDLER_ADM.DROP_STMT_HANDLER( handler_name IN VARCHAR2);
パラメータ
表165-7 DROP_STMT_HANDLERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
文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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
文DMLハンドラの名前。 |
|
削除する文の順位。 正の整数、負の整数、小数を指定できます。また、0(ゼロ)を指定することもできます。
指定した実行順序番号が文DMLハンドラに存在しない場合は、エラーが発生します。 |