SQL ゲートウェイを使用したデータベースへのアクセス
InterSystems SQL ゲートウェイを使用すると、JDBC および ODBC 経由で InterSystems IRIS® Data Platform から外部データベースにアクセスできます。これらについて、以下のトピックで説明します。
-
InterSystems SQL ゲートウェイのアーキテクチャ — SQL ゲートウェイの内部構造および制約について説明します。
-
外部ソースへの SQL ゲートウェイ接続の作成 — 論理接続の定義の概要を説明します。これは SQL ゲートウェイ・ウィザードでの外部データベースの特定に使用されます。
-
リンク・テーブル・ウィザード : テーブルまたはビューへのリンク — InterSystems IRIS オブジェクトへのアクセスと同じ方法でデータにアクセスできるように、外部ソースのテーブルまたはビューにリンクする手順について説明します。
-
プロシージャへのリンク作成ウィザード : ストアド・プロシージャへのリンク — 外部ソースのストアド・プロシージャにリンクする手順について説明します。
-
SQL ゲートウェイ接続の制御 — SQL ゲートウェイの接続の管理に使用されるメソッドを説明します。
論理接続定義の作成の詳細は、以下のセクションを参照してください。
SQL ゲートウェイ接続は、リンク・テーブル・ウィザードとリンク・プロシージャ・ウィザードでそれぞれプログラムによって作成された、または相互運用性機能の一部として作成された、リモートのテーブルおよびプロシージャへのアクセスに使用されます。SQL ゲートウェイ定義で取得した情報は、外部テーブルの作成にも使用できます。これは、リモートのデータベースまたはファイルから InterSystems IRIS SQL にデータを投影するための純粋な SQL アプローチです。ここでは、リンク・テーブル・ウィザードを使用して外部テーブルにアクセスする方法についてのみ説明します。外部テーブルの使用法の詳細は、"外部テーブル" を参照してください。
InterSystems SQL ゲートウェイのアーキテクチャ
InterSystems SQL ゲートウェイは、内部的には以下のコンポーネントを使用しています。
-
接続マネージャは、InterSystems IRIS の論理接続定義のリストを管理します。各定義には InterSystems IRIS で使用する論理名、および ODBC または JDBC 準拠の特定の外部データベースに関する接続の詳細が含まれています。InterSystems SQL ゲートウェイは、接続の確立時にこれらの論理名を使用します (“外部ソースへの SQL ゲートウェイ接続の作成” を参照)。
-
InterSystems SQL ゲートウェイ API は、サードパーティの RDBMS と通信するために InterSystems IRIS プログラムで使用される一連の関数です。これらの関数は、ODBC または JDBC 呼び出しを作成する共有ライブラリを使用して実装されます。
-
外部テーブル・クエリ・プロセッサは、外部テーブルを対象とするクエリを処理する InterSystems SQL クエリ・プロセッサの拡張機能です。
-
SQL ディクショナリには、すべての定義済み SQL テーブルのリストが格納されます。任意のテーブルは、そのデータが外部の RDBMS に保存されたときに "外部" のものとしてマークされます。InterSystems SQL クエリ・プロセッサによって、SQL クエリ内で参照されたテーブルが外部のテーブルであることが検出されると、このプロセッサは、外部テーブル・クエリ・プロセッサを起動します。外部テーブル・クエリ・プロセッサでは、InterSystems IRIS 内に格納されているデータにアクセスする代わりに、InterSystems SQL ゲートウェイ API を呼び出すことによって、クエリ実行プランが生成されます。
InterSystems IRIS の外部テーブルの永続化
InterSystems IRIS のオブジェクト永続性はすべて、ストレージ・クラスによって実現されます ("クラスの定義と使用" の “ストレージ定義とストレージ・クラス” を参照)。ストレージ・クラスによって、データベース内の永続オブジェクトの保存および取得に必要なコードが生成されます。SQL ストレージ・クラス (%Storage.SQL) は、特別に生成された SQL クエリを使用してオブジェクトの永続性を実現します。
永続性を確保するために %Storage.SQL を使用するクラスでは、そのクラスの CONNECTION および EXTERNALTABLENAME クラス・パラメータに値を指定することによって "外部の" クラスであることを示します。クラス・コンパイラでは、そのクラスの SQL テーブル定義を作成し、オブジェクト永続性コードの SQL クエリを生成します。これらのクエリは、外部テーブル・クエリ・プロセッサによって自動的に正しい外部データベースを呼び出します。
SQL ゲートウェイ・クエリに関する制限事項
InterSystems SQL ゲートウェイを使用する場合、以下の制限事項に注意してください。
-
複数のデータ・ソースからデータを結合するクエリは、ODBC 接続の場合にのみサポートされます。JDBC を使用する場合、SQL クエリの FROM 節にあるすべてのテーブルは、同じデータ・ソースから派生したものである必要があります。
-
外部データベースを対象とした SQL クエリでは、以下の InterSystems SQL 拡張文法を使用できません。
-
"->" 演算子
-
%EXACT 関数、または EXACT に設定された照合フラグを伴う %SYSTEM.UtilOpens in a new tab Collation()Opens in a new tab メソッド
-
Count (*) クエリ内に他の列を含むこと
-
名前が % で始まる InterSystems IRIS 固有の演算子
-
外部ソースへの SQL ゲートウェイ接続の作成
InterSystems IRIS では、外部データ・ソースへの接続の論理名である、SQL ゲートウェイ接続定義のリストが管理されます。各接続定義は、論理名 (InterSystems IRIS 内で使用するため)、データ・ソースへの接続情報、および接続を確立するときに使用するユーザ名とパスワードで構成されます。これらの接続は、%Library.sys_SQLConnection テーブルに格納されます。このテーブルのデータをエクスポートして、同じバージョンの InterSystems IRIS の別のインスタンスにインポートできます。
SQL ゲートウェイ接続の構成要素は、以下のとおりです。
-
接続の論理名。この名前は、InterSystems SQL クエリなどで使用されます。
-
データベースにアクセスするためのログイン資格情報 (オプション)。
-
JDBC または ODBC ドライバを制御するための情報 (オプション)。
-
ドライバ固有の接続の詳細 :
-
JDBC 用 : JDBC クライアント・ドライバの完全クラス名、ドライバ・クラス・パス (JDBC ドライバの特定時に検索する JAR ファイルのリスト)、および JDBC 接続 URL
-
ODBC 用 : 通常の方法で定義された DSN (データ・ソース名) ("InterSystems ODBC ドライバの使用法" の "Windows での ODBC データ・ソースの定義" および "UNIX® での ODBC データ・ソースの定義" を参照)。
Note:Microsoft SQL Server DNS 構成を使用して、リンク・テーブル・ウィザードで使用される接続を作成する場合は、[地域設定を使用] オプションを設定しないでください。このオプションは、データを処理するアプリケーションではなく、データを表示するアプリケーションのみを対象としています。
-
論理接続定義の作成の詳細は、以下の章を参照してください。
リンク・テーブル・ウィザード : テーブルまたはビューへのリンク
管理ポータルには、ODBC 準拠または JDBC 準拠のデータベースの外部テーブルへのリンクに使用できるウィザードがあります。外部テーブルにリンクすると、以下の操作を実行できます。
-
サードパーティのリレーショナル・データベースに保存されたデータへ、InterSystems IRIS アプリケーション内でオブジェクトや SQL クエリを使用してアクセスします。
-
InterSystems IRIS の永続オブジェクトを外部リレーショナル・データベースに格納します。
例えば、Employee テーブルが、外部リレーショナル・データベースに保存されているとします。JDBC または ODBC 経由で SQL クエリを実行することによって外部データベースと通信する Employee クラスを作成することによって、このテーブルをオブジェクトとして InterSystems IRIS 内で使用できます。
InterSystems IRIS アプリケーションから見ると、Employee クラスは他の永続クラスと同じように動作します。インスタンスを開き、変更して、それを保存できます。SQL クエリを Employee クラスに対して発行する場合、このクラスは自動的に外部データベースに送信されます。
InterSystems SQL ゲートウェイの使用は、アプリケーション論理とは独立した関係です。最小限の処理でアプリケーション論理が変更されることなく外部データベースと組み込みの InterSystems IRIS データベースの間で切り替わるようにアプリケーションを変更することができます。
InterSystems SQL ゲートウェイを使用して、オブジェクトに永続性を提供するクラスは、使用性においては、ネイティブの永続性を使用して、Java、SQL、Web アクセスなどの InterSystems IRIS のすべての機能を使用できるクラスと同等です。
リンク・テーブル・ウィザードの使用法
外部テーブルまたはビューにリンクする場合、そのテーブルまたはビューにリンクされる InterSystems IRIS 永続クラスを作成します。その新しいクラスは、SQL ゲートウェイを使用して外部ソースからデータを取得したり、格納したりします。InterSystems IRIS クラスと InterSystems IRIS 内の対応する SQL テーブルの両方に関する情報を指定できます。
このウィザードでは、制御対象のクラス名およびクラス・メンバ名を使用して ObjectScript コードが生成されます。このウィザードを使用する場合は、長さ制限も含め、ObjectScript 識別子のルールに従う必要があります ("クラスの定義と使用" の "名前付け規約" のセクションを参照)。
-
外部データベースへの接続をまだ作成していない場合は、開始する前に作成してください (“外部ソースへの SQL ゲートウェイ接続の作成” を参照)。
-
管理ポータルで、[システム・エクスプローラ]、[SQL] の順に選択します。ページ上部に表示されている現在のネームスペース名をクリックして、ネームスペースを選択します。利用可能なネームスペースのリストが表示されます。
ページ上部の [ウィザード] ドロップダウン・リストをクリックし、[リンクテーブル] を選択します。
-
ウィザードの最初のページで、以下のように 1 つまたは複数のテーブルまたはビューを選択します。
-
[宛先のネームスペースを選択してください] — データのコピー先の InterSystems IRIS ネームスペースを選択します。
-
[スキーマ・フィルタ] — テーブルまたはビューを含むスキーマ (クラス・パッケージ) 名を指定します。ワイルドカードを使用して名前を指定し、複数のスキーマを返すことや、% を使用してすべてのスキーマを返すことができます。例えば、C% は、先頭文字が C であるネームスペース内のすべてのスキーマを返します。選択元となるスキーマの返されるリストが短くなることでロード速度が向上するため、このフィルタを使用することをお勧めします。複数の項目を選択できます。複数の項目を選択する場合、[次へ] をクリックすると、次の画面にパッケージ名の入力を求めるプロンプトが表示されます。クラスを格納するパッケージの名前を指定して、[完了] をクリックします。
-
[テーブル・フィルタ] — リンク先のテーブルまたはビューを指定します。ワイルドカードを使用して名前を指定し、複数のテーブルまたはビューを返すことや、% を使用してすべてのテーブル/ビューを返すことができます。
-
[テーブルタイプ] — [テーブル]、[ビュー]、[システムテーブル]、または [すべて] を選択します。既定は [テーブル] です。
-
[SQL ゲートウェイ接続を選択してください] — 使用する SQL ゲートウェイ接続を選択します。
-
-
[次へ] をクリックします。
-
2 ページ目で、InterSystems IRIS のオブジェクト・プロパティとして使用できるようにするフィールドを指定します。以下のように変更します。
-
1 つ以上のフィールドをハイライト表示して一重矢印をクリックすると、そのフィールドが 1 つのリストから別のリストに移動します。二重矢印をクリックすると、すべてのフィールドが (選択されているかどうかにかかわらず) 1 つのリストから別のリストに移動します。
-
選択したリストで、上下の矢印を使用して、InterSystems IRIS が所定のクラスに投影するテーブル内のフィールドの順序を変更できます。これは、クラス定義のプロパティの順序には影響しません。
-
-
[次へ] をクリックします。
-
3 ページ目では、生成されたクラスのプロパティに関する情報を指定します。プロパティごとに、使用可能なすべてのオプションを指定できます。
-
[読み取り専用] — プロパティを読み取り専用にする場合、このチェック・ボックスにチェックを付けます。これにより、プロパティの ReadOnly キーワードが制御されます。
Tip:[select_all] チェック・ボックスを使用すると、この列のすべてのチェック・ボックスにチェックを付けたり、外したりできます。
-
[新規プロパティ名] — このフィールドのデータを含めるオブジェクト・プロパティの名前を指定します。
-
[新規列名 (SQL フィールド名)] — このプロパティに使用する SQL フィールド名を指定します。これにより、プロパティの SqlFieldName キーワードが制御されます。
-
-
[次へ] をクリックします。
-
最後のページで、以下を指定します。
-
[主キー] — 提供されたリストから新規 InterSystems IRIS テーブルの主キーを選択します。提供された既定のキーのほかにも、[参照] ボタンをクリックして 1 つまたは複数の列を選択できます。複数の列を選択できますが、複数の列は、コンマで区切られた複合キーとして返されます。主キーを指定する必要があります。
-
[新規クラス名] — パッケージを含め、作成する InterSystems IRIS クラスの名前を指定します。既定のパッケージ名は nullschema です。
-
[新規テーブル名] — InterSystems IRIS で作成する SQL テーブルの名前を指定します。これにより、クラスの SqlTableName キーワードが制御されます。
-
-
[完了] ボタンをクリックします。[バックグラウンド・ジョブ] ページに、バックグラウンド・タスクのページへのリンクが表示されます。
-
[閉じる] をクリックします。または、バックグラウンド・タスクのページを表示する特定のリンクをクリックします。いずれの場合も、ウィザードによって、処理を実行するバックグラウンド・タスクが開始されます。
ウィザードにより、InterSystems IRIS データベース内に新しいクラス定義が保存され、そのクラス定義がコンパイルされます。データが存在する場合、外部データベースで即時に表示されます (新規に作成された InterSystems IRIS クラス/テーブルに対して SQL クエリを発行することでチェックできます)。これで InterSystems IRIS 内の他の永続クラスと同様に、新規のクラスを使用できます。
設計上、リンク・テーブル・ウィザードによって生成されたコードは、それ自体が開いた接続を切断しないようになっています。これにより、接続を共有する SQL 文間の競合などの問題が回避されます。詳細は、“SQL ゲートウェイ接続の制御” を参照してください。
リンクされたテーブルを使用する場合の制限事項
通常どおり、接続先のデータベースに固有の制限事項 (構文上など) および要件を理解しておくことが重要です。いくつかの例を以下に示します。
-
JDBC 接続では、ODBC とは異なり、異なる複数の INSERT...SELECT 文 (ローカル・テーブルとリンク・テーブルの両方、または 2 つのリンク・テーブルを含む) はサポートされません。
-
JDBC とは異なり、ODBC 接続では %ROWID プロパティには入力しません。
-
Informix : リンクされた Informix テーブルに基づくビューを InterSystems SQL 内で作成することはできません。これは、Informix では生成された SQL が有効でないためです。
-
Sybase : クエリ処理の一環として、InterSystems SQL は外部結合の式を同等の正規化された形式に変換できます。リンクされたテーブルにアクセスする場合、この形式を SQL として再構築するために SQL92 標準の CROSS JOIN 構文が必要になることがあります。Sybase は SQL92 標準の CROSS JOIN をサポートしていないため、リンクされた Sybase テーブルに対して外部結合を使用する一部のクエリは実行に失敗します。
-
Oracle : Oracle ソース・テーブルで使用される COUNT 集約に CAST を実行する必要があります。
-
MySQL : INOUT と OUT でストアド・プロシージャにアクセスすると、結合したパラメータは正しく更新されません。代わりに、値は結果セットで返されます。
リンクされたテーブルを使用する前に、そのテーブルに対して生成されたクエリ・キャッシュを検証して、使用しているデータベースで構文が有効であることを確認することをお勧めします。リンクされた特定のテーブルに対するクエリ・キャッシュを確認するには、以下の操作を実行します。
-
管理ポータルで、[システム・エクスプローラ]、[SQL] の順に移動します。
-
対象のネームスペースをクリックします。
-
プルダウン・リストからスキーマを選択します。
-
対象のテーブルが含まれるパッケージの [クエリキャッシュ] をクリックします。このパッケージに対するクエリ・キャッシュのテーブルが表示されます。[クエリ] 列には、完全なクエリが表示されます。
-
オプションで、クエリのリンクをクリックして、その他の詳細を表示します。
プロシージャへのリンク作成ウィザード : ストアド・プロシージャへのリンク
管理ポータルには、ODBC 準拠または JDBC 準拠のデータベースで定義されたストアド・プロシージャへのリンクに使用できるウィザードがあります。プロシージャにリンクすると、メソッドおよびそのメソッドを含むクラスが生成されます。ストアド・プロシージャにリンクする場合、そのストアド・プロシージャが実行するものと同じ操作を実行するクラス・メソッドを作成します。このメソッドは、SqlProc キーワードでマークします。このクラス・メソッドは、新しいクラス内に生成されます。クラス名やパッケージ名などの情報を指定できます。このメソッドは、可変個数の引数を受け取ることはできません。既定のパラメータは許可されますが、ストアド・プロシージャのシグニチャは固定されています。
設計上、リンク・プロシージャ・ウィザードによって生成されたコードは、それ自体が開いた接続を切断しないようになっています。これにより、接続を共有する SQL 文間の競合などの問題が回避されます。詳細は、“SQL ゲートウェイ接続の制御” を参照してください。
-
外部データベースへの接続をまだ作成していない場合は、開始する前に作成してください (“外部ソースへの SQL ゲートウェイ接続の作成” を参照)。
-
管理ポータルで、[システム・エクスプローラ]、[SQL] の順に選択します。ページ上部に表示されている現在のネームスペース名をクリックして、ネームスペースを選択します。利用可能なネームスペースのリストが表示されます。
ページ上部の [ウィザード] ドロップダウン・リストをクリックし、[プロシージャのリンク] を選択します。
-
ウィザードの最初のページで、以下のように 1 つまたは複数のプロシージャを選択します。
-
[宛先のネームスペースを選択してください] — データのコピー先の InterSystems IRIS ネームスペースを選択します。
-
[スキーマ・フィルタ] — プロシージャを含むスキーマ (クラス・パッケージ) 名を指定します。ワイルドカードを使用して名前を指定し、複数のスキーマを返すことや、% を使用してすべてのスキーマを返すことができます。例えば、C% は、先頭文字が C であるネームスペース内のすべてのスキーマを返します。選択元となるスキーマの返されるリストが短くなることでロード速度が向上するため、このフィルタを使用することをお勧めします。
-
[プロシージャ・フィルタ] — リンク先となるプロシージャを指定します。ワイルドカードを使用して名前を指定し、複数のプロシージャを返すことや、% を使用してすべてのプロシージャを返すことができます。複数のプロシージャを選択できます。複数の項目を選択する場合、[次へ] をクリックすると、次の画面にパッケージ名の入力を求めるプロンプトが表示されます。クラスを格納するパッケージの名前を指定して、[完了] をクリックします。
-
[SQL ゲートウェイ接続を選択してください] — 使用する SQL ゲートウェイ接続を選択します。
-
-
[次へ] をクリックします。
-
2 ページ目で、InterSystems IRIS で生成するクラスに関する詳細を指定します。
-
[新規パッケージ名] — クラスを含めるパッケージの名前を指定します。
-
[新規クラス名] — 生成するクラスの名前を指定します。
-
[新規プロシージャ名] — プロシージャの名前、具体的には、メソッドの SqlName キーワードを制御するプロシージャの名前を指定します。
-
[新規メソッド名] — 生成するメソッドの名前を指定します。
-
[メソッド名の説明] — オプションで、メソッドの説明を入力します。これは、クラス定義のコメントとして使用され、クラス・リファレンスに表示されます。
-
-
[完了] ボタンをクリックします。[バックグラウンド・ジョブ] ページに、バックグラウンド・タスクのページへのリンクが表示されます。
-
[閉じる] をクリックします。または、バックグラウンド・タスクのページを表示する特定のリンクをクリックします。いずれの場合も、ウィザードによって、処理を実行するバックグラウンド・タスクが開始されます。
ウィザードにより、InterSystems IRIS データベース内に新しいクラス定義が保存され、そのクラス定義がコンパイルされます。
このウィザードでは、制御対象のクラス名およびクラス・メンバ名を使用して ObjectScript コードが生成されます。このウィザードを使用する場合は、長さ制限も含め、ObjectScript 識別子のルールに従う必要があります ("クラスの定義と使用" の "名前付け規約" のセクションを参照)。
SQL ゲートウェイ接続の制御
場合によっては、外部テーブルまたはストアド・プロシージャをリンクするコードによって作成された接続の管理が必要になります (“リンク・テーブル・ウィザード” および “リンク・プロシージャ・ウィザード” を参照)。SQL ゲートウェイ接続は、%SYSTEM.SQLGatewayOpens in a new tab クラスによって管理できます。このクラスには、以下のようなメソッドがあります。
-
DropAll()Opens in a new tab — 開いているすべての接続を中断し、SQL ゲートウェイ・ライブラリをアンロードします。
-
DropConnection()Opens in a new tab — 指定された JDBC または ODBC 接続を切断します。
-
TestConnection()Opens in a new tab — 前に定義した SQL ゲートウェイ接続をテストし (“外部ソースへの SQL ゲートウェイ接続の作成” を参照)、診断の出力を現在のデバイスに書き込みます。
-
接続の確立およびトランザクションの制御のためのさまざまなメソッド。全詳細は、%SYSTEM.SQLGatewayOpens in a new tab クラス・ドキュメントを参照してください。
これらのメソッドは、特別な $SYSTEM オブジェクトを使用して呼び出すことができます。例えば、以下のコマンドは、前に定義した "MyConnectionName" という名前の SQL ゲートウェイ接続を切断します。
do $system.SQLGateway.DropConnection("MyConnectionName")
SQL ゲートウェイ接続名の大文字と小文字は区別されます。