ヘッダーをスキップ
Oracle® Database Heterogeneous Connectivityユーザーズ・ガイド
11gリリース2 (11.2)
E94922-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 異機種間サービス・エージェントの使用

この章では、異機種間サービス(HS)エージェントの使用方法について説明します。エージェントのインストールおよび構成については、Oracle Database Gatewayのインストレーションおよび構成ガイドを参照してください。この章の構成は、次のとおりです。

4.1 初期化パラメータ

初期化パラメータを使用してゲートウェイを構成します。そのためには、初期化ファイルを作成し、このファイル内で必要なパラメータを設定します。構成の詳細は、2.5項を参照してください。

異機種間サービスの初期化パラメータは、Oracle Databaseの初期化パラメータとは異なります。異機種間サービスの初期化パラメータは、Oracleデータベースの初期化パラメータ・ファイル(init.oraファイル)ではなく、異機種間サービスの初期化ファイル内で設定します。ゲートウェイ・インスタンスごとに、異機種間サービスの初期化ファイルがあります。

この項では、次の項目について説明します。

4.1.1 初期化パラメータの暗号化

初期化パラメータには、IDやパスワードなどの機密情報が含まれている場合があります。初期化パラメータは、プレーン・テキストに格納され、セキュリティ上安全ではありません。異機種間サービスに暗号化機能が追加され、パラメータ値の暗号化が可能になりました。暗号化には、dg4pwdユーティリティが使用されます。この機能を使用する場合は、初期化ファイルのパラメータ値を、引用符なしのアスタリスク(*)に設定する必要があります。次に例を示します。

HD_FDS_CONNECT_INFO = *

値をこのセキュリティ・マーカーに設定することで、実際の値が関連する暗号化パスワード・ファイルに格納されることをすべての異機種間サービス・エージェントが認識します。このファイルの名前はinitsid.pwdです(sidはゲートウェイで使用されるOracleシステム識別子です)。このファイルはdg4pwdユーティリティによって、初期化ファイルを含む現在のディレクトリに作成されます。ユーティリティを実行すると、パラメータの実際の値を入力するように求められます。この値がユーティリティによって暗号化されてパスワード・ファイルに格納されます。暗号化初期化パラメータは暗黙的にPRIVATEパラメータとして扱われ、サーバーにアップロードされないことに注意してください。

4.1.1.1 dg4pwdユーティリティの使用

dg4pwdユーティリティは、通常ならプレーン・テキストで初期化パラメータ・ファイルに格納される初期化パラメータを暗号化するために使用されます。このユーティリティは、初期化パラメータ・ファイルを現在のディレクトリに読み込み、値にセキュリティ・マーカーが付いたパラメータを検索します。セキュリティ・マーカーは、引用符なしのアスタリスク(*)です。セキュリティ・マーカーにより、このパラメータの値を暗号化してパスワード・ファイルに格納するように指定されます。次に、この値に設定された初期化パラメータの例を示します。

HS_FDS_CONNECT_INFO = *

最初に、現在のディレクトリにある初期化パラメータ・ファイルを編集して、パラメータの値をセキュリティ・マーカーに設定します。次に、このユーティリティを実行し、コマンドラインでゲートウェイSIDを、また暗号化情報に別の所有者を指定する場合はオプションでユーザーIDも指定します。このユーティリティは、初期化パラメータ・ファイルを読み込み、暗号化する実際の値を入力するよう要求します。コマンドの構文は次のとおりです。

dg4pwd [sid] {userid}

ここで、[sid]はゲートウェイのSID、{userid}は内容を暗号化する際に使用するオプションのユーザーIDです。ユーザーIDが指定されていない場合は、現行のユーザーIDが使用されます。値はこのIDを使用して暗号化されます。値を復号化する場合は、このユーザーとしてエージェントを実行する必要があります。次の例では、ゲートウェイのSIDをSYBASEと想定しています。

dg4pwd SYBASE
ORACLE Gateway Password Utility
Constructing password file for Gateway SID SYBASE
Enter the value for HS_FDS_CONNECT_INFO
sybasew

前の例では、初期化パラメータ・ファイルinitSYBASE.oraが読み取られます。パラメータHS_FDS_CONNECT_INFOは暗号化が必要であると識別されます。値(sybasewなど)を入力して、[Enter]を押します。暗号化が必要なパラメータがまだある場合は、その値が求められます。暗号化されたデータは初期化ファイルと同じディレクトリに格納されます。暗号化を必要とする初期化パラメータは、Oracle Database Gatewayを使用する前に暗号化しておく必要があります。

4.1.2 ゲートウェイ初期化パラメータ

ゲートウェイ初期化パラメータは、2つのグループにわけることができます。一方はすべてのゲートウェイに共通する汎用初期化パラメータの集合で、他方は個々のゲートウェイに固有の初期化パラメータの集合です。次に、汎用初期化パラメータの中から、このマニュアルで説明する汎用初期化パラメータのみを示します。


HS_BULK
HS_CALL_NAME
HS_COMMIT_POINT_STRENGTH
HS_DB_DOMAIN
HS_DB_INTERNAL_NAME
HS_DB_NAME
HS_DESCRIBE_CACHE_HWM
HS_FDS_CONNECT_INFO
HS_FDS_DEFAULT_SCHEMA_NAME
HS_FDS_SHAREABLE_NAME
HS_FDS_TRACE_LEVEL
HS_LANGUAGE
HS_LONG_PIECE_TRANSFER_SIZE
HS_NLS_DATE_FORMAT
HS_NLS_DATE_LANGUAGE
HS_NLS_NCHAR
HS_NLS_NUMERIC_CHARACTERS
HS_NLS_TIMESTAMP_FORMAT
HS_NLS_TIMESTAMP_TZ_FORMAT
HS_OPEN_CURSORS
HS_ROWID_CACHE_SIZE
HS_RPC_FETCH_REBLOCKING
HS_RPC_FETCH_SIZE
HS_TIME_ZONE

前述のパラメータの設定時には、PRIVATEキーワードを使用しないでください。PRIVATEキーワードを使用すると、パラメータがサーバーにアップロードされず、SQL処理中にエラーが発生する可能性があります。前述のパラメータはいずれも環境での設定は必須ではないため、SETキーワードを使用する必要はありません。


関連項目:

ゲートウェイ固有の初期化パラメータのリストについては、各ゲートウェイのマニュアルを参照してください。

4.2 バルク・フェッチを使用したデータ転送の最適化

アプリケーションで異機種間サービスを使用してOracle以外のシステムからデータをフェッチする場合、データは次の順序で転送されます。

  1. Oracle以外のシステムからエージェント・プロセスへ。

  2. エージェント・プロセスからOracle Databaseへ。

  3. Oracle Databaseからアプリケーションへ。

Oracleでは、図4-1に示すように3つのデータ転送がすべて最適化されます。

図4-1 データ転送の最適化

図4-1の説明が続きます
「図4-1 データ転送の最適化」の説明

この項の内容は次のとおりです。

4.2.1 OCI、Oracleプリコンパイラまたは他のツールを使用した配列フェッチ

アプリケーションとOracle Database間のデータ転送は、配列フェッチを使用して最適化できます。配列フェッチの詳細と、データ送信量および各ネットワーク・ラウンドトリップの指定方法は、アプリケーション開発ツールのマニュアルを参照してください。

4.2.2 Oracle Databaseとエージェント間の配列フェッチの制御

OracleがOracle以外のシステムからデータを取得する場合、異機種間サービスのHS_RPC_FETCH_SIZE初期化パラメータにより、エージェントとOracle Database間のフェッチごとに送信されるバイト数が定義されます。エージェントは、次のいずれかが発生するまでOracle以外のシステムからデータをフェッチします。

  • Oracle Databaseへの送信分として指定のバイト数が累積された場合。

  • Oracle以外のシステムから結果セットの最終行がフェッチされた場合。

4.2.3 エージェントとOracle以外のシステム間の配列フェッチの制御

Oracle以外のシステムから取得される行数は、HS_FDS_FETCH_ROWS初期化パラメータにより決定されます。エージェントでは配列フェッチがサポートされる必要があることに注意してください。エージェント固有のマニュアルを参照し、エージェントで配列フェッチがサポートされることを確認してください。

4.2.4 配列フェッチの再ブロック化の制御

デフォルトでは、エージェントはシステムへの送信分として十分なデータを取得するまで、Oracle以外のシステムからデータをフェッチします。つまり、Oracle以外のシステムからフェッチされたバイト数がHS_RPC_FETCH_SIZE初期化パラメータの値以上になるまで、フェッチが続行されます。言い換えると、エージェントはOracle Databaseとの間で、HS_RPC_FETCH_SIZE初期化パラメータの値により定義されたサイズ単位でデータを再ブロック化します。

Oracle以外のシステムで配列フェッチがサポートされる場合は、配列フェッチによりOracle以外のシステムからフェッチしたデータを、HS_RPC_FETCH_SIZE初期化パラメータの正確な値に達するまで待たずにOracle Databaseに即時に送信できます。つまり、Oracle以外のシステムからOracle Databaseにデータをストリームし、HS_RPC_FETCH_REBLOCKING初期化パラメータの値をOFFに設定して再ブロック化を無効にできます。

たとえば、HS_RPC_FETCH_SIZEを64 KB、HS_FDS_FETCH_ROWSを100行に設定するとします。また、各行のサイズが約600バイトであるとすると、100行では約60 KBになります。HS_RPC_FETCH_REBLOCKING初期化パラメータをONに設定すると、エージェントはOracle以外のシステムから100行のフェッチを開始します。

エージェントにはデータが60KBしかないため、データはOracle Databaseに送信されません。かわりに、エージェントはOracle以外のシステムから次の100行をフェッチします。これでエージェントにあるデータが120KBになったため、最初の64KBをOracle Databaseに送信できます。

この時点で、エージェントには56 KBのデータが残っています。エージェントはOracle以外のシステムからさらに100行をフェッチした後、次の64KBのデータをOracle Databaseに送信します。HS_RPC_FETCH_REBLOCKING初期化パラメータをOFFに設定すると、最初の100行がOracleデータベース・サーバーに即時に送信されます。

4.3 パラレル・ロードを使用したデータ・ロードの最適化

DBMS_HS_PARALLEL PL/SQLパッケージにより、異機種間ターゲット・アクセスのパラレル処理が可能になります。このパッケージは、外部の大規模な表からデータを取得するときにパフォーマンスを改善します。

DBMS_HS_PARALLELCURRENT_USERの認証IDでコンパイルされます。つまり、実行者の権限を使用します。つまり、このパッケージのすべてのプロシージャは、コール・ユーザーの権限で実行されます。

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

4.4 エージェントの登録

登録とは、Oracleによりエージェント情報がデータ・ディクショナリに格納される操作です。エージェントの登録は必須ではありません。エージェントが未登録の場合、Oracleではエージェント情報は、データ・ディクショナリのかわりにメモリーに格納されます。エージェントに関係するセッションが終了すると、この情報は使用できなくなります。

自動登録とは、エージェントが情報をデータ・ディクショナリに自動的にアップロードできるように、データベース管理者が初期化パラメータを設定する操作です。自動登録が実行されるのは、HS_AUTOREGISTER初期化パラメータがTRUE(デフォルト)に設定されている場合のみです。


注意:

HS_AUTOREGISTERは、init.oraファイル内で設定するOracle初期化パラメータです。ゲートウェイ初期化ファイル内で設定する異機種間サービスの初期化パラメータではありません。

この項の内容は次のとおりです。

4.4.1 エージェント自動登録の有効化

異機種間データベース・リンク上での正常動作を保証するため、エージェント自動登録により、リモート・ホスト上のエージェントを記述する異機種間サービス構成データの更新が自動化されます。エージェント自動登録はデフォルトの動作です。エージェント自動登録機能を使用しない場合は、HS_AUTOREGISTER初期化パラメータをFALSEに設定してください。

サーバーとエージェントは、どちらも3種類の情報に依存して異機種間サービス接続の操作を構成および制御します。この3セットの情報をまとめてHS構成データと呼びます。

異機種間サービス構成データ 説明
異機種間サービス初期化パラメータ 操作の各種接続固有の詳細を制御します。
機能定義 Oracle以外のデータ・ソースでサポートされるSQL言語機能などの詳細を識別します。
データ・ディクショナリ変換 Oracleデータ・ディクショナリ表およびビューへの参照を、Oracle以外のデータ・ソース固有の等価の表およびビューにマップします。

4.4.1.1 エージェント自動登録を使用した構成不一致の回避

HS構成データは、Oracleデータベース・サーバーのデータ・ディクショナリに格納されます。リモート・エージェントであるために別個に管理される場合があるので、ある状況下ではサーバーとエージェントの間で構成が一致しなくなる可能性があります。次に例を示します。

  • エージェントが別のコンピュータに新しくインストールされ、サーバーの異機種間サービス・データ・ディクショナリには、そのエージェントの異機種間サービス構成データを表す内容が存在しない場合があります。

  • サーバーが新しくインストールされ、既存のエージェントとOracle以外のデータ・ストアに関する必要な異機種間サービス構成データが欠落している場合があります。

  • Oracle以外のインスタンスが旧バージョンから新バージョンにアップグレードされ、異機種間サービス構成データの変更が必要になる場合があります。

  • リモート・サイトの異機種間サービス・エージェントが新バージョンにアップグレードされるか、パッチが適用され、異機種間サービス構成データの変更が必要になる場合があります。

  • Oracle以外のサイトのデータベース管理者(DBA)が、異機種間サービス構成データに影響するような方法で、チューニングやテストのためにエージェントの設定を変更する場合があります。

エージェント自動登録により、これらのすべての使用例で異機種間サービスを正常に操作できます。特に、エージェント自動登録により、Oracleデータベース・サーバーと異機種間サービス・エージェント(それぞれがリリース8.0.3以上の場合)の相互運用性が強化されます。この機能の基本的なメカニズムは、異機種間サービス構成データをエージェントからサーバーにアップロードする機能です。

自動登録により、Oracleデータベース・サーバーのデータ・ディクショナリに常駐する異機種間サービス構成データが自動的に更新されます。この更新により、エージェント自動登録のアップロードは、未登録エージェントを最初に使用するときに1回実行すればよいことになります。インスタンス情報は、サーバーのデータ・ディクショナリに格納されるのではなく、接続ごとにアップロードされます。

4.4.1.2 エージェント自動登録の概要

異機種間サービスのエージェント自動登録機能では、次のタスクを実行できます。

  • エージェントとOracle以外のデータ・ストアをOracleデータベース・サーバーに対して識別します。

  • エージェントに対して、エージェントと接続先Oracleサーバーの両方に使用する異機種間サービス初期化パラメータの定義を許可します。

  • 接続の初期化中に、機能定義とデータ・ディクショナリ変換(使用可能な場合)を異機種間サービス・エージェントからアップロードします。


    注意:

    クラス情報は、クラスがサーバーのデータ・ディクショナリで定義されていないときにのみアップロードされます。同様に、インスタンス情報は、インスタンスがサーバーのデータ・ディクショナリで定義されていない場合にのみアップロードされます。

エージェント自動登録に必要な情報には、次のエージェント指定名を使用してサーバーのデータ・ディクショナリ内でアクセスします。

4.4.1.2.1 FDS_CLASSおよびFDS_CLASS_VERSION

FDS_CLASSおよびFDS_CLASS_VERSIONは、Oracleまたはサード・パーティ・ベンダーにより、異機種間サービス・エージェントとバージョンごとに個別に定義されます。Oracle異機種間サービスでは、これらの名前が連結されてFDS_CLASS_NAMEとなり、サーバーのデータ・ディクショナリ内のクラス情報にアクセスするための主キーとして使用されます。

FDS_CLASSにはアクセスするOracle以外のデータ・ストアのタイプを指定し、FDS_CLASS_VERSIONにはOracle以外のデータ・ストアとそこに接続するエージェントのバージョン番号を指定する必要があります。エージェントのいずれかのコンポーネントに変更があった場合は、新リリースを一意に識別するようにFDS_CLASS_VERSIONも変更する必要があることに注意してください。


注意:

この情報は、各接続の初期化時にアップロードされます。

4.4.1.2.2 FDS_INST_NAME

インスタンス固有の情報をサーバーのデータ・ディクショナリに格納できます。インスタンス名FDS_INST_NAMEは、該当のエージェントを管理するデータベース管理者(DBA)により構成されます。DBAによるこの構成の実行方法は、使用中のエージェントに応じて異なります。

Oracleデータベース・サーバーでは、FDS_INST_NAMEを使用して、データ・ディクショナリ内でインスタンス固有の構成情報が参照されます。Oracleでは、その値が次のビューで同じ名前を持つ列の主キーとして使用されます。

  • FDS_INST_INIT

  • FDS_INST_CAPS

  • FDS_INST_DD

FDS_INST_NAMEを使用したサーバーのデータ・ディクショナリへのアクセスでも、FDS_CLASS_NAMEを使用して構成情報の行が一意に識別されます。たとえば、データベースをクラスSybase816からクラスSybase817に移植する場合、両方のデータベースが同時にインスタンス名SCOTTで動作し、別個の構成情報セットを使用することが可能です。

クラス情報とは異なり、インスタンス情報はサーバーのデータ・ディクショナリに自動登録されません。

  • インスタンス情報は(存在する場合)常にエージェントによりアップロードされます。ただし、サーバーのデータ・ディクショナリに格納されることはありません。かわりに、その情報はメモリーに保持され、その接続においてのみ有効です。

  • サーバーのデータ・ディクショナリにインスタンス情報が含まれている場合は、そのインスタンス構成に対応する、データベース管理者が定義した設定の詳細を表します。データ・ディクショナリで定義されているインスタンス情報はクラス情報より優先されます。ただし、データ・ディクショナリで定義されているインスタンス情報よりも、アップロードされたインスタンス情報が優先されます。

4.4.1.3 HS_AUTOREGISTERの指定

Oracleデータベース・サーバーのHS_AUTOREGISTER初期化パラメータを使用すると、異機種間サービス・エージェントの自動登録を有効化または無効化できます。このパラメータは、エージェントの初期化ファイルではなくOracle初期化パラメータ・ファイル内で指定することに注意してください。たとえば、次のようにパラメータを設定できます。

HS_AUTOREGISTER = TRUE

TRUEに設定すると、エージェントは、以前に認識されていないエージェント・クラスまたは新規エージェント・バージョンの記述情報を、サーバーのデータ・ディクショナリにアップロードします。

このパラメータにはデフォルト値(TRUE)を使用することをお薦めします。この設定により、サーバーのデータ・ディクショナリの内容は常に、異機種間サービス接続に使用されるクラス機能とデータ・ディクショナリ変換の定義を確実に正しく表すものになります。


関連項目:

このパラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。

4.4.2 エージェント自動登録の無効化

エージェント自動登録を無効化するには、HS_AUTOREGISTER初期化パラメータを次のように設定します。

HS_AUTOREGISTER = FALSE

エージェント自動登録を無効化すると、エージェント情報はデータ・ディクショナリに格納されません。そのため、異機種間サービスのデータ・ディクショナリ・ビューは有効な情報ソースでなくなります。ただし、Oracleサーバーは、各エージェントのクラスおよびインスタンスに関する情報を引き続き必要とします。エージェント自動登録を無効化すると、サーバーではこの情報がローカル・メモリーに格納されます。

4.5 Oracleデータベース・サーバーのSQL構文の処理

異機種間サービスとゲートウェイは、SQL文の変換または後処理が必要な場合、そのSQL文を書き換えます。

次の例では、Oracle以外のデータベースでINITCAP関数がサポートされていないことを前提にしています。たとえば、Oracle以外のデータベースから次の操作を要求するプログラムを考えてみます。次に例を示します。

SELECT "COLUMN_A" FROM "test"@remote_db
    WHERE "COLUMN_A" = INITCAP("COLUMN_B");

INITCAP関数は、このOracle以外のデータベースでは認識されないため、Oracleデータベース・サーバーは、リモート・データベースのtest表からデータをフェッチして、ローカルで結果をフィルタします。ゲートウェイは、SELECT文を次のように書き換えます。

SELECT "COLUMN_A", "COLUMN_B" FROM "test"@remote_db;

問合せ結果がゲートウェイからOracleに送られ、Oracleデータベース・サーバーによりフィルタされます。

前述の例に示した"COLUMN_B"に文字リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。

SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = INITCAP('jones');

次のSQLコマンドがゲートウェイに送信されます。

SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = 'Jones';

次のUPDATE要求を考えてみます。

UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value'
    WHERE "COLUMN_A" = INITCAP("COLUMN_B");

この場合、Oracleデータベース・サーバーとゲートウェイはOracle以外のデータベース側のサポートの欠落を補えないため、エラーが発行されます。

前述の例の"COLUMN_B"に、文字列リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。

UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' 
    WHERE "COLUMN_A" = INITCAP('jones');

次のSQLコマンドがゲートウェイに送信されます。

UPDATE  "test"@remote_db SET "COLUMN_A" = 'new_value' 
    WHERE "COLUMN_A" = 'Jones';

以前のリリースでは、Oracle以外のデータベースでINITCAP関数がサポートされていないため、前述のUPDATE文でエラーが発生していました。

4.5.1 リモート・マップ文に対するデータ型チェックのサポート

Oracleデータベースは、同機種環境では常にデータ型チェックおよびデータ型の強制を実行します。たとえば、SELECT * FROM EMP WHERE EMPNO='7934'は、SELECT * FROM EMPNO WHERE EMPNO=7934と同じ結果を戻します。異機種環境でも同様に、リモート・マップ文に対して完全なデータ型チェックのサポートがあります。一般的に、SQL文のオペランドは、列、リテラル、バインド変数のいずれであっても、データ型チェックのために内部処理されます。次の例を考えてみます。

SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN='123'
SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_COLUMN;
SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_BIND_VARIABLE;

ほとんどのOracle以外のデータベースは、データ型の強制をサポートしていないため、前述の文がそのままOracle以外のデータベースに送信された場合は失敗します。Oracleデータベースの異機種間サービス・コンポーネントは、Oracle以外のデータベースに使用可能な文を送る前に、データ型チェックと必要なデータ型の強制を実行します。

データ型チェックは、処理後の文またはリモート・マップ文に対して一環した動作を提供します。次の2つの文を考えてみます。

SELECT * FROM EMP@LINK WHERE TO_CHAR(EMPNO)='7933' + '1';

および

SELECT * FROM EMP@LINK WHERE EMPNO='7933' + '1';

前述のどちらの文も、Oracle以外のデータベースでTO_CHAR関数がサポートされているかどうかに関係なく、同じ結果および強制が提供されます。ここで、次の文を考えてみます。

SELECT * FROM EMP@LINK WHERE EMPNO='123abc' + '1';

データ型チェックが実施されているため、Oracle内で強制が試行されるとエラーが発生し、Oracle以外のデータベースに文が送られることなくエラーが戻されます。

つまり、処理後の文であるかリモート・マップ文であるかに関係なく、データ型チェックおよび強制の動作は一貫しています。

4.6 Oracle以外のデータベースに対するユーザー定義関数の実行

Oracle以外のリモート・データベースでユーザー定義関数を実行できます。次に例を示します。

SELECT getdeptforemp@Remote_DB(7782) FROM dual;

この例では、リモート・データベース内でユーザー定義関数が実行され、従業員7782に関する部門情報を戻すSELECT文が発行されています。

リモート関数がOracleデータベース内にある場合、Oracleデータベースでは、リモート関数によりデータベースの状態(データベースの行やPL/SQLパッケージの状態など)が更新されないことが自動的に確認されます。リモート関数がOracle以外のデータベースに常駐している場合、ゲートウェイではこのことを確認できません。したがって、ユーザーは、どのデータベースにおいてもユーザー定義関数により状態が更新されないように確認する必要があります。この確認が必要となるのは、読取り一貫性を保証するためです。

セキュリティ対策として、リモートで実行する関数とその所有者を、ゲートウェイ固有の初期化パラメータ・ファイルのHS_CALL_NAMEパラメータで指定する必要があります。次に例を示します。


HS_CALL_NAME = "owner1.A1, owner2.A2 "

owner1owner2は、リモート関数の所有者名です。A1A2は、リモート関数名です。リモート関数の所有者をSQL文で指定する必要はありません。リモート関数は、デフォルトでDatabase Gatewayの接続先スキーマに常駐する必要があります。他の場所に常駐する場合は、リモート関数の所有者をSQL文で指定してください。

ユーザー定義のリモート関数のその他の実行例を次に示します。

前述の例では、OracleデータベースはDatabase Gatewayに関数名と所有者を渡します。ユーザー定義関数はリモート・データベース上で実行されます。

4.7 シノニムの使用

Oracle Databaseのシノニム機能を使用することで、データの場所の透過性とネットワークの透過性を完全に実現できます。シノニムを定義すると、ユーザーは、基礎となる表またはネットワーク・プロトコルを認識する必要がなくなります。シノニムは、すべてのOracleユーザーが参照できるようにパブリックとして指定できます。また、シノニムをプライベートとして指定することもできます。この場合、すべてのOracleユーザーがOracle以外の表にアクセスするためにシノニムを定義する必要があります。

次の文では、SybaseデータベースのユーザーORACLEのスキーマ内で、emp表に対してシステム単位のシノニムが作成されます。

CREATE PUBLIC SYNONYM emp FOR "ORACLE"."EMP"@SYBS;


関連項目:

シノニムの詳細は、『Oracle Database管理者ガイド』を参照してください。


4.7.1 分散問合せの例


注意:

これらの例を環境にあわせて変更してください。そのままの状態では実行しないでください。

次の文では、Oracleデータベース・サーバー、IBM DB2データベースおよびSybaseデータベース間でデータが結合されます。

SELECT O.CUSTNAME, P.PROJNO, E.ENAME, SUM(E.RATE*P."HOURS")
       FROM ORDERS@DB2 O, EMP@ORACLE9 E, "PROJECTS"@SYBS P
       WHERE O.PROJNO = P."PROJNO"
          AND P."EMPNO" = E.EMPNO
       GROUP BY O.CUSTNAME, P."PROJNO", E.ENAME;

ビューとシノニムの組合せを介して次のSQL文を使用すると、分散問合せの処理が透過的になります。

CREATE SYNONYM ORDERS FOR ORDERS@DB2;
CREATE SYNONYM PROJECTS FOR "PROJECTS"@SYBS;
CREATE VIEW DETAILS (CUSTNAME,PROJNO,ENAME,SPEND)
      AS 
      SELECT O.CUSTNAME, P."PROJNO", E.ENAME, SUM(E.RATE*P."HOURS")
      SPEND
      FROM ORDERS O, EMP E, PROJECTS P
      WHERE O.PROJNO = P."PROJNO"
      AND P."EMPNO" = E.EMPNO
      GROUP BY O.CUSTNAME, P."PROJNO", E.ENAME;

次のSQL文を使用して、1つの文でデータ・ストアから情報を取得します。

SELECT * FROM DETAILS;

この文では次の表が取得されます。

CUSTNAME         PROJNO           ENAME          SPEND
--------         ------           -----          -----
ABC Co.             1             Jones            400
ABC Co.             1             Smith            180
XYZ Inc.            2             Jones            400
XYZ Inc.            2             Smith            180


4.8 Oracleデータベース・サーバーからOracle以外のデータベース・システムへのデータのコピー

異機種間サービスでは、コールバック・リンクがサポートされます。これにより、次のようなSQL文を実行できます。

INSERT INTO table_name@dblink SELECT column_list FROM table_name;

異機種間サービスではコールバック機能がサポートされますが、この機能が実装されていないゲートウェイもあります。使用中のゲートウェイにこの機能が実装されていない場合、前述のINSERT文では次のエラー・メッセージが戻されます。

ORA-02025: All tables in the SQL statement must be at the remote database

関連項目:

コールバック・リンクのサポートについては、ゲートウェイのマニュアルを参照してください。

コールバック・リンクをサポートしていないゲートウェイの場合は、SQL*PlusのCOPYコマンドを使用できます。構文は次のとおりです。

COPY FROM username/password@db_name -
   INSERT destination_table -
   USING query;

次の例では、ローカルのOracleのemp表からすべての行が選択され、Oracle以外のデータベースのemp表に挿入され、トランザクションがコミットされます。

COPY FROM SCOTT/TIGER@inst1 -
  INSERT EMP@remote_db -
  USING SELECT * FROM EMP;



The COPY command supports the APPEND, CREATE, INSERT, and REPLACE options. However, INSERT is the only option supported when copying to non-Oracle databases. The SQL*Plus COPY command does not support copying to tables with lowercase table names. Use the following PL/SQL syntax with lowercase table names: DECLARE v1 oracle_table.column1%TYPE; v2 oracle_table.column2%TYPE; v3 oracle_table.column3%TYPE; . . . CURSOR cursor_name IS SELECT * FROM oracle_table; BEGIN OPEN cursor_name; LOOP FETCH cursor_name INTO v1, v2, v3, ... ; EXIT WHEN cursor_name%NOTFOUND; INSERT INTO destination_table VALUES (v1, v2, v3, ...); END LOOP; CLOSE cursor_name; END;

関連項目:

COPYコマンドの詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。

4.9 Oracle以外のデータベース・システムからOracleデータベース・サーバーへのデータのコピー

CREATE TABLE文を使用すると、Oracle以外のデータベースからOracleデータベースにデータをコピーできます。ローカル・データベースに表を作成し、Oracle以外の表から行を挿入するには、次の構文を使用します。

CREATE TABLE table_name AS query;

次の例では、ローカルのOracleデータベースにemp表が作成され、Oracle以外のデータベースのEMP表から行が挿入されます。

CREATE TABLE table1 AS SELECT * FROM "EMP"@remote_db;



Alternatively, you can use the SQL*Plus COPY command to copy data from the non-Oracle database to the Oracle database server.

関連項目:

COPYコマンドの詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。


4.10 異機種間サービスのデータ・ディクショナリ・ビューの使用

異機種間サービスのデータ・ディクショナリ・ビューを使用すると、異機種間サービスに関する情報にアクセスできます。この節では、以下のトピックについて説明します。

4.10.1 ビューのタイプ

異機種間サービスのデータ・ディクショナリ・ビューは、次のカテゴリに分類できます。ビュー名はすべて接頭辞HS_で始まります。

  • 汎用ビュー

  • トランザクション・サービス用のビュー

  • SQLサービス用のビュー

データ・ディクショナリ・ビューのほとんどは、クラスとインスタンスの両方に対して定義されています。ほとんどのタイプのデータには、*_CLASSビューと*_INSTビューがあります。詳細は、表4-1を参照してください。

表4-1 異機種間サービスのデータ・ディクショナリ・ビュー

ビュー 識別内容

HS_BASE_CAPS

SQLサービス

異機種間サービスでサポートされている全機能

HS_BASE_DD

SQLサービス

異機種間サービスでサポートされている、すべてのデータ・ディクショナリ変換表名

HS_CLASS_CAPS

トランザクション・サービス、SQLサービス

各クラスの機能

HS_CLASS_DD

SQLサービス

各クラスのデータ・ディクショナリ変換

HS_CLASS_INIT

汎用

各クラスの初期化パラメータ

HS_FDS_CLASS

汎用

Oracleサーバーからアクセス可能なクラス

HS_FDS_INST

汎用

Oracleサーバーからアクセス可能なインスタンス

HS_INST_CAPS

トランザクション・サービス、SQLサービス

各インスタンスの機能(DBAが設定している場合)

HS_INST_DD

SQLサービス

各クラスのデータ・ディクショナリ変換(DBAが設定している場合)

HS_INST_INIT

汎用

各インスタンスの初期化パラメータ(DBAが設定している場合)

HS_BULK


バルク・ロード・プロシージャで作成した内部オブジェクトを追跡するためのデータ・ディクショナリ・ビュー。


すべてのOracleデータ・ディクショナリ表と同様に、これらのビューは読取り専用です。基礎となる表の内容は変更しないでください。

4.10.2 データ・ディクショナリ情報のソース

異機種間サービス・データベース・リンクを介した特定の接続でデータ・ディクショナリの内容として使用される値は、次のソースから取得できます。各ソースを優先順に示します。

  • セッションの開始時に接続先異機種間サービス・エージェントによりアップロードされるインスタンス情報。この情報により、Oracleデータ・ディクショナリ内の対応する内容がオーバーライドされますが、Oracleデータ・ディクショナリには格納されません。

  • Oracleデータ・ディクショナリに格納されているインスタンス情報。このデータにより、接続先クラスの対応する内容がオーバーライドされます。

  • Oracleデータ・ディクショナリに格納されているクラス情報。

Oracleデータベース・サーバーの実行時にHS_AUTOREGISTERサーバー初期化パラメータがFALSEに設定されている場合、Oracleデータ・ディクショナリに情報が自動的に格納されることはありません。接続が確立されるたびに、接続ごとに異機種間サービス・エージェントにより等価のデータがアップロードされ、インスタンス固有の情報がクラス情報より優先されます。


注意:

エージェントがインスタンス情報をアップロードできる可能性があるため、特定のセッションに使用中の機能とデータ・ディクショナリ変換は明確に判断できません。

V$HS_PARAMETERビューのVALUE列を問い合せると、異機種間サービスの初期化パラメータの値を判断できます。V$HS_PARAMETERVALUE列では、実際の初期化パラメータ値が最大255文字から最大64文字に切り捨てられることに注意してください。パラメータ名は最大64文字から最大30文字に切り捨てられます。

4.10.3 汎用ビューの使用

次のビューは、すべてのサービスに共通です。

ビュー 内容
HS_FDS_CLASS Oracleデータ・ディクショナリにアップロードされたクラスの名前
HS_FDS_INST Oracleデータ・ディクショナリにアップロードされたインスタンスの名前
HS_CLASS_INIT 異機種間サービス初期化パラメータに関する情報

たとえば、Oracleデータベース・サーバーから複数のSybaseゲートウェイにアクセスできます。ゲートウェイに初めてアクセスすると、Oracleデータベース・サーバーにアップロードされた情報が次のように表示される場合があります。

SQL> SELECT * FROM HS_FDS_CLASS; 

FDS_CLASS_NAME        FDS_CLASS_COMMENTS             FDS_CLASS_ID
--------------------- ------------------------------ ------------
Sybase816             Uses Sybase driver, R1.1                 1
Sybase817             Uses Sybase driver, R1.2                21

2つのクラス(Sybase816にアクセスするクラスとSybase817にアクセスするクラス)がアップロードされています。Oracleデータベース・サーバーのデータ・ディクショナリには、Sybase816とSybase817の両方のための機能情報、SQL変換およびデータ・ディクショナリ変換が含まれます。

Oracleデータベース・サーバーのデータ・ディクショナリには、アクセス対象であるOracle以外の各システム・インスタンスに対するHS_FDS_INSTビューのインスタンス情報も含まれます。

4.10.4 トランザクション・サービス・ビューの使用

Oracle以外のシステムが分散トランザクションに関係する場合、分散トランザクションに関与できるかどうかは、そのシステムとエージェントのトランザクション機能により制御されます。トランザクション機能は、HS_CLASS_CAPS表に格納されます。

Oracle以外のシステムとエージェントが2フェーズ・コミット・プロトコルをサポートできるかどうかは、2PCタイプの機能により指定されます。次の表に示すタイプのいずれかを指定できます。

機能
読取り専用(RO) Oracle以外のシステムに対して実行できるのは、SQLのSELECT文を使用した問合せのみです。プロシージャ・コールはデータを書き込むと想定されるため許可されません。
単一サイト(SS) Oracle以外のシステムでリモート・トランザクションを処理できますが、分散トランザクションは処理できません。つまり、2フェーズ・コミット・プロトコルには関与できません。
コミット確認(CC) Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、コミット・ポイント・サイトとしてのみ関与できます。つまり、データを準備できませんが、グローバル・コーディネータから要求された場合は、特定のトランザクションの結果を記憶できます。
2フェーズ・コミット(2PC) Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、コミット・ポイント・サイトではなく通常の2フェーズ・コミット・ノードとして関与できます。つまり、データを準備できますが、グローバル・コーディネータから要求されても特定のトランザクションの結果を記憶できません。
2フェーズ・コミット確認(2PCC) Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、通常の2フェーズ・コミット・ノードまたはコミット・ポイント・サイトとして関与できます。つまり、データを準備でき、グローバル・コーディネータから要求された場合は、特定のトランザクションの結果を記憶できます。

異機種間サービスのHS_CLASS_CAPSデータ・ディクショナリ・ビューを使用すると、ドライバとOracle以外のシステムでサポートされているトランザクション・モデルを問い合せることができます。

次に、2PCタイプの機能の1つを示します。


SELECT cap_description, translation
FROM   hs_class_caps
WHERE  cap_description LIKE '2PC%'
AND    fds_class_name LIKE 'SYBASE%';

CAP_DESCRIPTION                          TRANSLATION
---------------------------------------- -----------
2PC type (RO-SS-CC-PREP/2P-2PCC)                  CC



When the non-Oracle system and agent support distributed transactions, the non-Oracle system is treated like any other Oracle server. When a failure occurs during the two-phase commit protocol, the transaction is recovered automatically. If the failure persists, the in-doubt transaction may need to be manually overridden by the database administrator.

4.10.5 SQLサービス・ビューの使用

SQLサービス固有のデータ・ディクショナリ・ビューには、次の情報が含まれています。

  • Oracle以外のデータ・ソースのSQL機能とSQL変換

  • Oracleデータ・ディクショナリ・ビューからOracle以外のシステムのデータ・ディクショナリへのマッピングに使用されるデータ・ディクショナリ変換


    注意:

    この項では、SQLサービス関連機能の一部についてのみ説明します。これらの設定を管理上の目的で変更する必要はないため、これらの機能についてはこの項では説明しません。

4.10.5.1 機能と変換に関するビューの使用

HS_*_CAPSデータ・ディクショナリ表には、Oracle以外のデータ・ソースのSQL機能と必須のSQL変換に関する情報が含まれています。これらのビューでは、Oracle以外のデータ・ストアまたはOracleデータベース・サーバーに特定のSQL言語機能が実装されるかどうかが指定されます。機能がオフになっている場合、Oracleでは、その機能を必要とするOracle以外のデータ・ソースにSQL文は送信されませんが、後処理は実行されます。

4.10.5.2 データ・ディクショナリ変換に関するビューの使用

Oracle以外のシステムがOracleデータベース・サーバーと同様にみえるように、異機種間サービス接続により、Oracleデータ・ディクショナリ・ビューの限定セットがOracle以外のシステムのデータ・ディクショナリにマップされます。このマッピングにより、アプリケーションでは、これらのビューがOracleデータ・ディクショナリに属している場合と同様に問合せを発行できます。このアクセスは、データ・ディクショナリ変換により可能になります。これらの変換は、名前に接尾辞_DDを含む各異機種間サービス・ビューに格納されます。

たとえば、次のSELECT文は、Sybaseのデータ・ディクショナリ表からemp表の情報を取得するSybaseの問合せに変換されます。

SELECT * FROM USER_TABLES@remote_db WHERE UPPER(TABLE_NAME)='EMP';

データ・ディクショナリ表は、変換するかわりに疑似実行できます。必要な情報がOracle以外のデータ・ソースのデータ・ディクショナリにないために、データ・ディクショナリ変換ができない場合、異機種間サービスではデータ・ディクショナリ表が使用可能であるかのように表示されますが、表には情報が含まれていません。

Oracle以外のシステム用に変換または疑似実行されるOracleデータ・ディクショナリ・ビューまたは表の情報を取得するには、ユーザーSYSとして接続し、HS_CLASS_DDビューに対して次の問合せを発行します。

SELECT DD_TABLE_NAME, TRANSLATION_TYPE
FROM   HS_CLASS_DD
WHERE  FDS_CLASS_NAME LIKE 'SYBASE%';

DD_TABLE_NAME                  T
-----------------------------  -
ALL_ARGUMENTS                  M
ALL_CATALOG                    T
ALL_CLUSTERS                   T
ALL_CLUSTER_HASH_EXPRESSIONS   M
ALL_COLL_TYPES                 M
ALL_COL_COMMENTS               T
ALL_COL_PRIVS                  M
ALL_COL_PRIVS_MADE             M
ALL_COL_PRIVS_RECD             M
...

変換タイプTは、変換が存在することを示します。変換タイプがMの場合は、データ・ディクショナリ表が疑似実行されます。

4.11 異機種間サービスの動的パフォーマンス・ビューの使用

Oracleデータベース・サーバーでは、エージェント、セッションおよびパラメータに関する情報が格納されます。動的パフォーマンス・ビューを使用すると、この情報にアクセスできます。この項の内容は次のとおりです。

4.11.1 ホストで実行されているエージェントの判別: V$HS_AGENTビュー

V$HS_AGENTでは、指定されたホスト上で現在実行中の異機種間サービス・エージェントのセットを識別します。表4-2に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。

表4-2 V$HS_AGENTビューの重要な列

説明

AGENT_ID

エージェントへの接続に使用されるOracle NetセッションID(listener.ora SID)

MACHINE

オペレーティング・システム・マシン名

PROGRAM

エージェントのプログラム名

AGENT_TYPE

エージェントのタイプ

FDS_CLASS_ID

外部データ・ストア・クラスのID

FDS_INST_ID

外部データ・ストアのインスタンス名


4.11.2 オープン状態の異機種間サービス・セッションの判別: V$HS_SESSIONビュー

V$HS_SESSIONビューには、エージェントごとのセッションが表示され、使用されるデータベース・リンクが指定されます。表4-3に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。

表4-3 V$HS_SESSIONビューの重要な列

説明

HS_SESSION_ID

異機種間サービスの一意のセッションID

AGENT_ID

エージェントへの接続に使用されるOracle NetセッションID(listener.ora SID)

DB_LINK

エージェントへのアクセスに使用されるサーバーのデータベース・リンク名(NULLは、外部プロシージャの使用時など、データベース・リンクが使用されないことを意味します)

DB_LINK_OWNER

DB_LINKのデータベース・リンクの所有者


4.11.3 異機種間サービスのパラメータの判別: V$HS_PARAMETERビュー

V$HS_PARAMETERビューには、Oracleデータベース・サーバーに登録済の異機種間サービスのパラメータと値が表示されます。表4-4に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。

表4-4 V$HS_SESSIONビューの重要な列

説明

HS_SESSION_ID

異機種間サービスの一意のセッションID

PARAMETER

異機種間サービス・パラメータ名

VALUE

異機種間サービス・パラメータの値


分散接続の確立に使用されたデータベース・リンク、起動時刻、およびセッションに使用された初期化パラメータのセットに関する情報も表示できます。ランタイム情報は、すべて動的に更新される表から導出されます。