Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Caché SQL ゲートウェイの使用法

Caché SQL ゲートウェイを使用すると、JDBC および ODBC 経由で Caché から外部データベースにアクセスできます。以下の項目について説明します。

Caché SQL ゲートウェイのアーキテクチャ

Caché SQL ゲートウェイは、内部的には以下のコンポーネントを使用しています。

  • 接続マネージャは、Caché の論理接続定義のリストを管理します。各定義には Caché で使用する論理名、および ODBC または JDBC 準拠の特定の外部データベースに関する接続の詳細が含まれています。Caché SQL ゲートウェイは、接続の確立時にこれらの論理名を使用します ("外部ソースへのゲートウェイ接続の作成" を参照)。

  • Caché SQL ゲートウェイ API は、サードパーティの RDBMS と通信するために Caché プログラムで使用される一連の関数です。これらの関数は、ODBC または JDBC 呼び出しを作成する共有ライブラリを使用して実装されます。

  • 外部テーブル・クエリ・プロセッサは、外部テーブルを対象とするクエリを処理する Caché SQL クエリ・プロセッサの拡張機能です。

  • SQL ディクショナリには、すべての定義済み SQL テーブルのリストが格納されます。任意のテーブルは、そのデータが外部の RDBMS に保存されたときに "外部" のものとしてマークされます。Caché SQL クエリ・プロセッサによって、SQL クエリ内で参照されたテーブルが外部のテーブルであることが検出されると、このプロセッサは、外部テーブル・クエリ・プロセッサを起動します。外部テーブル・クエリ・プロセッサでは、Caché 内に格納されているデータにアクセスする代わりに、Caché SQL ゲートウェイ API を呼び出すことによって、クエリ実行計画が生成されます。

Caché の外部テーブルの永続化

Caché のオブジェクト永続性はすべて、ストレージ・クラスによって実現されます ("Caché オブジェクトの使用法" の "ストレージ定義とストレージ・クラス" を参照)。ストレージ・クラスによって、データベース内の永続オブジェクトの保存および取得に必要なコードが生成されます。SQL ストレージ・クラス (%CacheSQLStorageOpens in a new tab) は、特別に生成された SQL クエリを使用してオブジェクトの永続性を実現します。

永続性を確保するために %CacheSQLStorageOpens in a new tab を使用するクラスでは、そのクラスの CONNECTION および EXTERNALTABLENAME クラス・パラメータに値を指定することによって "外部の" クラスであることを示します。クラス・コンパイラでは、そのクラスの SQL テーブル定義を作成し、オブジェクト永続性コードの SQL クエリを生成します。これらのクエリは、外部テーブル・クエリ・プロセッサによって自動的に正しい外部データベースを呼び出します。

SQL ゲートウェイ・クエリに関する制限事項

Caché SQL ゲートウェイを使用する場合、以下の制限条件に注意してください。

  • SQL クエリの FROM 節にあるすべてのテーブルは、同じデータ・ソースから派生したものである必要があります。複数のデータ・ソースから、データを結合するクエリは許可されません。

  • 外部データベースを対象とした SQL クエリでは、以下の Caché SQL 拡張文法を使用できません。

外部ソースへのゲートウェイ接続の作成

Caché では、外部データ・ソースへの接続の論理名である、SQL ゲートウェイ接続定義のリストが管理されます。各接続定義は、論理名 (Caché 内で使用するため)、データ・ソースへの接続情報、および接続を確立するときに使用するユーザ名とパスワードで構成されます。これらの接続は、%Library.sys_SQLConnection テーブルに格納されます。このテーブルのデータをエクスポートして、別の Caché インスタンスにインポートできます。

ゲートウェイ接続の構成要素は、以下のとおりです。

  • ゲートウェイ接続の論理名。この名前は、Caché SQL クエリなどで使用されます。

  • データベースにアクセスするためのログイン資格情報 (オプション)。

  • JDBC または ODBC ドライバを制御するための情報 (オプション)。

  • ドライバ固有の接続の詳細 :

    • JDBC 用 : JDBC クライアント・ドライバの完全クラス名、ドライバ・クラス・パス (JDBC ドライバの特定時に検索する JAR ファイルのリスト)、および JDBC 接続 URL

    • ODBC 用 : 通常の方法で定義された DSN (データ・ソース名) ("ODBC での Caché の使用法" の "ODBC データ・ソースとしての Caché の使用法 (Windows)" および "ODBC データ・ソースとしての Caché の使用法 (UNIX)" を参照)

      Note:

      Microsoft SQL Server DNS 構成を使用して、リンク・テーブル・ウィザードで使用される SQL ゲートウェイ接続を作成する場合は、[地域設定を使用] オプションを設定しないでください。このオプションは、データを処理するアプリケーションではなく、データを表示するアプリケーションのみを対象としています。

JDBC および ODBC の論理接続定義の作成の詳細は、以下を参照してください。

リンク・テーブル・ウィザード : テーブルまたはビューへのリンク

管理ポータルには、ODBC 準拠または JDBC 準拠のデータベースの外部テーブルへのリンクに使用できるウィザードがあります。外部テーブルにリンクすると、以下の操作を実行できます。

  • 外部のリレーショナル・データベースに保存されたデータへ、Caché アプリケーション内でオブジェクトや SQL クエリを使用してアクセスします。

  • Caché の永続オブジェクトを外部リレーショナル・データベースに格納します。

例えば、Employee テーブルが、外部リレーショナル・データベースに保存されているとします。JDBC または ODBC 経由で SQL クエリを実行することによって外部データベースと通信する Employee クラスを作成することによって、このテーブルをオブジェクトとして Caché 内で使用できます。

Caché アプリケーションから見ると、Employee クラスは他の永続クラスと同じように動作します。インスタンスを開き、変更して、それを保存できます。SQL クエリを Employee クラスに対して発行する場合、このクラスは自動的に外部データベースに送信されます。

Caché SQL ゲートウェイの使用は、アプリケーション論理とは独立した関係です。最小限の処理でアプリケーション論理が変更されることなく外部データベースと組み込みの Caché データベースの間で切り替わるようにアプリケーションを変更することができます。

Caché SQL ゲートウェイを使用して、オブジェクトに永続性を提供するクラスは、使用性においては、ネイティブの永続性を使用して、Java、ActiveX、SQL、Web アクセスなどの Caché のすべての機能を使用できるクラスと同等です。

リンク・テーブル・ウィザードの使用法

外部テーブルまたはビューにリンクする場合、そのテーブルまたはビューにリンクされる Caché 永続クラスを作成します。その新しいクラスは、SQL ゲートウェイを使用して外部ソースからデータを取得したり、格納したりします。Caché クラスと Caché 内の対応する SQL テーブルの両方に関する情報を指定できます。

Note:

このウィザードでは、制御対象のクラス名およびクラス・メンバ名を使用して ObjectScript コードが生成されます。このウィザードを使用する場合は、長さ制限も含め、ObjectScript 識別子のルールに従う必要があります ("Caché オブジェクトの使用法" の "名前付け規約" のセクションを参照)。

  • 外部データベースへのゲートウェイ接続をまだ作成していない場合は、開始する前に作成してください ("外部ソースへのゲートウェイ接続の作成" を参照)。

  • 管理ポータルで [システム・エクスプローラ] を選択し、[SQL] (システム, SQL) を選択します。ページ上部の [切り替え] オプションを使ってネームスペースを選択します。利用可能なネームスペースのリストが表示されます。

    ページ上部の [ウィザード] ドロップダウン・リストをクリックし、[リンクテーブル] を選択します。

  • ウィザードの最初のページで、以下のように 1 つまたは複数のテーブルまたはビューを選択します。

    • [宛先のネームスペースを選択してください] — データのコピー先の Caché ネームスペースを選択します。

    • [スキーマ・フィルタ] — テーブルまたはビューを含むスキーマ (クラス・パッケージ) 名を指定します。ワイルドカードを使用して名前を指定し、複数のスキーマを返すことや、% を使用してすべてのスキーマを返すことができます。例えば、C% は、先頭文字が C であるネームスペース内のすべてのスキーマを返します。選択元となるスキーマの返されるリストが短くなることでロード速度が向上するため、このフィルタを使用することをお勧めします。複数の項目を選択できます。複数の項目を選択する場合、[次へ] をクリックすると、次の画面にパッケージ名の入力を求めるプロンプトが表示されます。クラスを格納するパッケージの名前を指定して、[完了] をクリックします。

    • [テーブル・フィルタ] — リンク先のテーブルまたはビューを指定します。ワイルドカードを使用して名前を指定し、複数のテーブルまたはビューを返すことや、% を使用してすべてのテーブル/ビューを返すことができます。

    • [テーブルタイプ][テーブル][ビュー][システムテーブル]、または [すべて] を選択します。既定は [テーブル] です。

    • [SQL ゲートウェイ接続を選択してください] — 使用する SQL ゲートウェイ接続を選択します。

  • [次へ] をクリックします。

  • 2 ページ目で、Caché のオブジェクト・プロパティとして使用できるようにするフィールドを指定します。以下のように変更します。

    • 1 つ以上のフィールドをハイライト表示して一重矢印をクリックすると、そのフィールドが 1 つのリストから別のリストに移動します。二重矢印をクリックすると、すべてのフィールドが (選択されているかどうかにかかわらず) 1 つのリストから別のリストに移動します。

    • 選択したリストで、上下の矢印を使用して、Caché が所定のクラスに投影するテーブル内のフィールドの順序を変更できます。これは、クラス定義のプロパティの順序には影響しません。

  • [次へ] をクリックします。

  • 3 ページ目では、生成されたクラスのプロパティに関する情報を指定します。プロパティごとに、使用可能なすべてのオプションを指定できます。

    • [読み取り専用] — プロパティを読み取り専用にする場合、このチェック・ボックスにチェックを付けます。これにより、プロパティの ReadOnly キーワードが制御されます。

      Tip:

      [select_all] チェック・ボックスを使用すると、この列のすべてのチェック・ボックスにチェックを付けたり、外したりできます。

    • [新規プロパティ名] — このフィールドのデータを含めるオブジェクト・プロパティの名前を指定します。

    • [新規列名 (SQL フィールド名)] — このプロパティに使用する SQL フィールド名を指定します。これにより、プロパティの SqlFieldName キーワードが制御されます。

  • [次へ] をクリックします。

  • 最後のページで、以下を指定します。

    • [主キー] — 提供されたリストから新規 Caché テーブルの主キーを選択します。提供された既定のキーのほかにも、[参照] ボタンをクリックして 1 つまたは複数の列を選択できます。複数の列を選択できますが、複数の列は、コンマで区切られた複合キーとして返されます。主キーを指定する必要があります。

    • [新規クラス名] — パッケージを含め、作成する Caché クラスの名前を指定します。既定のパッケージ名は nullschema です。

    • [新規テーブル名] — Caché で作成する SQL テーブルの名前を指定します。これにより、クラスの SqlTableName キーワードが制御されます。

  • [完了] ボタンをクリックします。[バックグラウンド・ジョブ] ページに、バックグラウンド・タスクのページへのリンクが表示されます。

  • [閉じる] をクリックします。または、バックグラウンド・タスクのページを表示する特定のリンクをクリックします。いずれの場合も、ウィザードによって、処理を実行するバックグラウンド・タスクが開始されます。

ウィザードにより、Caché データベース内に新しいクラス定義が保存され、そのクラス定義がコンパイルされます。データが存在する場合、外部データベースで即時に表示されます (新規に作成された Caché クラス、もしくはテーブルに対して SQL クエリを発行することでチェックできます)。これで Caché 内の他の永続クラスと同様に、新規のクラスを使用できます。

Note:
リンク・テーブルの接続の切断

設計上、リンク・テーブル・ウィザードによって生成されたコードは、それ自体が開いた接続を切断しないようになっています。これにより、接続を共有する SQL 文間の競合などの問題が回避されます。詳細は、“ゲートウェイ接続の制御” を参照してください。

リンクされたテーブルを使用する場合の制限事項

通常どおり、接続先のデータベースに固有の制限事項 (構文上など) および要件を理解しておくことが重要です。いくつかの例を以下に示します。

  • Informix : リンクされた Informix テーブルに基づくビューを Caché 内で作成することはできません。これは、Informix では生成された SQL が有効でないためです。

  • Sybase : クエリ処理の一環として、Caché SQL は外部結合の式を同等の正規化された形式に変換できます。リンクされたテーブルにアクセスする場合、この形式を SQL として再構築するために SQL92 標準の CROSS JOIN 構文が必要になることがあります。Sybase は SQL92 標準の CROSS JOIN をサポートしていないため、リンクされた Sybase テーブルに対して外部結合を使用する一部のクエリは実行に失敗します。

リンクされたテーブルを使用する前に、そのテーブルに対して生成されたクエリ・キャッシュを検証して、使用しているデータベースで構文が有効であることを確認することをお勧めします。リンクされた特定のテーブルに対するクエリ・キャッシュを確認するには、以下の操作を実行します。

  • 管理ポータルで、システム, SQL に進み、[SQL操作] 列で [SQLスキーマを参照] を選択します。

  • 対象のネームスペースをクリックします。

  • 対象のテーブルが含まれるパッケージの隣にある [クエリ] リンクをクリックします。

  • このパッケージに対するクエリ・キャッシュのテーブルが表示されます。[クエリ] 列には、完全なクエリが表示されます。

  • オプションで、クエリのリンクをクリックして、その他の詳細を表示します。

プロシージャへのリンク作成ウィザード : ストアド・プロシージャへのリンク

管理ポータルには、ODBC 準拠または JDBC 準拠のデータベースで定義されたストアド・プロシージャへのリンクに使用できるウィザードがあります。プロシージャにリンクすると、メソッドおよびそのメソッドを含むクラスが生成されます。ストアド・プロシージャにリンクする場合、そのストアド・プロシージャが実行するものと同じ操作を実行するクラス・メソッドを作成します。このメソッドは、SqlProc キーワードでマークします。このクラス・メソッドは、新しいクラス内に生成されます。クラス名やパッケージ名などの情報を指定できます。このメソッドは、可変個数の引数を受け取ることはできません。既定のパラメータは許可されますが、ストアド・プロシージャのシグニチャは固定されています。

Note:

このウィザードでは、制御対象のクラス名およびクラス・メンバ名を使用して ObjectScript コードが生成されます。このウィザードを使用する場合は、長さ制限も含め、ObjectScript 識別子のルールに従う必要があります ("Caché オブジェクトの使用法" の "名前付け規約" のセクションを参照)。

  • 外部データベースへのゲートウェイ接続をまだ作成していない場合は、開始する前に作成してください ("外部ソースへのゲートウェイ接続の作成" を参照)。

  • 管理ポータルで [システム・エクスプローラ] を選択し、[SQL] (システム, SQL) を選択します。ページ上部の [切り替え] オプションを使ってネームスペースを選択します。利用可能なネームスペースのリストが表示されます。

    ページ上部の [ウィザード] ドロップダウン・リストをクリックし、[プロシージャのリンク] を選択します。

  • ウィザードの最初のページで、以下のように 1 つまたは複数のプロシージャを選択します。

    • [宛先のネームスペースを選択してください] — データのコピー先の Caché ネームスペースを選択します。

    • [スキーマ・フィルタ] — プロシージャを含むスキーマ (クラス・パッケージ) 名を指定します。ワイルドカードを使用して名前を指定し、複数のスキーマを返すことや、% を使用してすべてのスキーマを返すことができます。例えば、C% は、先頭文字が C であるネームスペース内のすべてのスキーマを返します。選択元となるスキーマの返されるリストが短くなることでロード速度が向上するため、このフィルタを使用することをお勧めします。

    • [プロシージャ・フィルタ] — リンク先となるプロシージャを指定します。ワイルドカードを使用して名前を指定し、複数のプロシージャを返すことや、% を使用してすべてのプロシージャを返すことができます。複数のプロシージャを選択できます。複数の項目を選択する場合、[次へ] をクリックすると、次の画面にパッケージ名の入力を求めるプロンプトが表示されます。クラスを格納するパッケージの名前を指定して、[完了] をクリックします。

    • [SQL ゲートウェイ接続を選択してください] — 使用する SQL ゲートウェイ接続を選択します。

  • [次へ] をクリックします。

  • 2 ページ目では、Caché で生成されたクラスに関する情報を指定します。

    • [新規パッケージ名] — クラスを含めるパッケージの名前を指定します。

    • [新規クラス名] — 生成するクラスの名前を指定します。

    • [新規プロシージャ名] — プロシージャの名前、具体的には、メソッドの SqlName キーワードを制御するプロシージャの名前を指定します。

    • [新規メソッド名] — 生成するメソッドの名前を指定します。

    • [メソッド名の説明] — オプションで、メソッドの説明を入力します。これは、クラス定義のコメントとして使用され、クラス・リファレンスに表示されます。

  • [完了] ボタンをクリックします。[バックグラウンド・ジョブ] ページに、バックグラウンド・タスクのページへのリンクが表示されます。

  • [閉じる] をクリックします。または、バックグラウンド・タスクのページを表示する特定のリンクをクリックします。いずれの場合も、ウィザードによって、処理を実行するバックグラウンド・タスクが開始されます。

ウィザードにより、Caché データベース内に新しいクラス定義が保存され、そのクラス定義がコンパイルされます。

Note:
リンク・プロシージャの接続の切断

設計上、リンク・プロシージャ・ウィザードによって生成されたコードは、それ自体が開いた接続を切断しないようになっています。これにより、接続を共有する SQL 文間の競合などの問題が回避されます。詳細は、“ゲートウェイ接続の制御” を参照してください。

ゲートウェイ接続の制御

場合によっては、外部テーブルまたはストアド・プロシージャをリンクするコードによって作成された接続の管理が必要になります (“リンク・テーブル・ウィザード” および “リンク・プロシージャ・ウィザード” を参照)。SQL ゲートウェイ接続は、%SYSTEM.SQLGatewayOpens in a new tab クラスによって管理できます。このクラスには、以下のようなメソッドがあります。

これらのメソッドは、特別な $SYSTEM オブジェクトを使用して呼び出すことができます。例えば、以下のコマンドは、前に定義した "MyConnectionName" という名前の SQL ゲートウェイ接続を切断します。

   do $system.SQLGateway.DropConnection("MyConnectionName")

SQL ゲートウェイ接続名の大文字と小文字は区別されます。

データ移行ウィザード : ODBC ソースからのデータの移行

管理ポータルには、外部テーブルまたは外部ビューからのデータの移行に使用できるウィザードがあります。

外部ソースのテーブルまたはビューからデータを移行する場合、そのテーブルまたはビューのデータを格納する永続クラスが生成され、データがコピーされます。このウィザードには、クラスの名前が移行元のテーブルまたはビューの名前と同じであり、同様にプロパティ名もテーブルやビューのものと同じであるという前提があります。クラスが生成されると、そのクラスには、外部データ・ソースとの接続はありません。

Note:

このウィザードでは、JDBC データ・ソースはまだサポートされていません。

  • 外部データベースへの SQL ゲートウェイ接続をまだ作成していない場合は、開始する前に作成してください ("外部ソースへのゲートウェイ接続の作成" を参照)。

  • 管理ポータルで [システム・エクスプローラ] を選択し、[SQL] (システム, SQL) を選択します。ページ上部の [切り替え] オプションを使ってネームスペースを選択します。利用可能なネームスペースのリストが表示されます。

    ページ上部の [ウィザード] ドロップダウン・リストをクリックし、[データ移行] を選択します。

  • ウィザードの最初のページで、以下のようにテーブルまたはビューを選択します。

    • [宛先のネームスペースを選択してください] — データのコピー先の Caché ネームスペースを選択します。

    • [スキーマ・フィルタ] — テーブルまたはビューを含むスキーマ (クラス・パッケージ) 名を指定します。ワイルドカードを使用して名前を指定し、複数のスキーマを返すことや、% を使用してすべてのスキーマを返すことができます。例えば、C% は、先頭文字が C であるネームスペース内のすべてのスキーマを返します。選択元となるスキーマの返されるリストが短くなることでロード速度が向上するため、このフィルタを使用することをお勧めします。

    • [テーブル・フィルタ] — テーブルまたはビューの名前を指定します。ワイルドカードを使用して名前を指定し、複数のテーブルまたはビューを返すことや、% を使用してすべてのテーブル/ビューを返すことができます。

    • [テーブルタイプ][テーブル][ビュー][システムテーブル]、または [すべて] を選択します。既定は [テーブル] です。

    • [SQL ゲートウェイ接続を選択してください] — 使用する SQL ゲートウェイ接続を選択します。

  • [次へ] をクリックします。

  • 次のページでは、必要に応じて、クラスごとに以下の情報を指定することができます。

    • [新規スキーマ] — クラスを含むパッケージを指定します。長さ制限も含め、ObjectScript 識別子のルールに従う必要があります ("Caché オブジェクトの使用法" の "名前付け規約" のセクションを参照)。

      Tip:

      すべてのクラスのパッケージ名を変更するには、この列の一番上に値を入力し、[すべて変更] をクリックします。

    • [定義をコピーする] — 外部ソースのテーブル定義に基づいてこのクラスを生成する場合は、このチェック・ボックスにチェックを付けます。クラスが既に生成されている場合は、このチェック・ボックスのチェックを外すことができます。

    • [データをコピーする] — 外部ソースからこのクラスのデータをコピーする場合は、このチェック・ボックスにチェックを付けます。データをコピーするときに、ウィザードによって、Caché クラスの既存データが上書きされます。

  • [次へ] をクリックします。ウィザードに以下のオプション設定が表示されます。

    • [妥当性検証無効] — チェックを付けると、INSERT コマンドの restriction パラメータで %NOCHECK が指定されて、データがインポートされます。

    • [インポート・プロセスのジャーナリングを無効化] — チェックを付けると、データ移行 (システム規模ではない移行) の実行プロセスについてジャーナリングが無効化されます。これにより、移行を高速化できますが、システム障害で移行が中断された場合、移行されたデータが不確定の状態で残される可能性があります。ジャーナリングは、実行が成功したかどうかにかかわらず、実行終了時に再有効化されます。

    • [インデックスを延期] — チェックを付けると、データの挿入後にインデックスが構築されます。ウィザードはクラスの %SortBegin() メソッドをテーブルへのデータ挿入の前に呼び出します。これにより、インデックス・エントリが並べ替えのための一時的な場所に書き込まれます。すべての行が挿入された後でウィザードが %SortEnd() を呼び出すと、インデックス・エントリは実際のインデックス位置に書き込まれます。テーブルにユニーク・インデックスが定義されており、一意の制約に対する違反を移行時にすべて検出したい場合は、[インデックスを延期] を使用しないでください。[インデックスを延期] を使用すると、一意の制約に対する違反は検出されません。

    • [トリガ無効] — チェックを付けると、INSERT コマンドの restriction パラメータで %NOTRIGGER が指定されて、データがインポートされます。

    • [インポート前にテーブルの既存データを削除する] — チェックを付けると、既存のデータは新しいデータにマージされずに削除されます。

  • [完了] ボタンをクリックします。新しいウィンドウが開き、[バックグラウンドジョブ] ページに、バックグラウンド・タスクのページへのリンクが表示されます。直ちにインポートを開始する場合は [閉じる] をクリックし、バックグラウンド・タスクのページを表示する場合は特定のリンクをクリックします。いずれの場合も、ウィザードによって、インポートはバックグラウンド・タスクとして開始されます。

  • [データ移行ウィザード] ウィンドウで [完了] をクリックして、管理ポータルのホーム・ページに戻ります。

Microsoft Access と外部キーの制約

データ移行ウィザードを Microsoft Access で使用する場合、Access のテーブルに定義されている外部キー制約のコピーが試行されます。これを実行するために、ウィザードでは、Access の MSysRelationships テーブルをクエリします。既定では、このテーブルは非表示であり、読み取りアクセス権がありません。ウィザードが MSysRelationships にアクセスできないと、ウィザードは、外部キー制約なしでデータ・テーブル定義を Caché に移行します。

このユーティリティによって外部キー制約をテーブル定義と共に移行するには、以下のように Microsoft Access で MSysRelationships に対する読み取りアクセスを付与するよう設定する必要があります。

  • Microsoft Access で、そのシステム・オブジェクトが表示されることを確認します。

  • [ツール]→[オプション] をクリックして、[ビュー] タブで設定を選択します。

  • [ツール]→[セキュリティ]→[ユーザー/グループの権限] をクリックします。テーブル名の隣の [読み取り] チェック・ボックスにチェックを付けます。

FeedbackOpens in a new tab