このようなシステムは、 統合、統合、またはマルチベースと呼ばれます。
CachéDBMSでは、このような統合は、外部データソースへのODBC / JDBC接続を使用する特別なゲートウェイ( CachéSQLゲートウェイ )を使用して実行されます。 さらに、この場合、MS Excel、DBF、テキストファイル、イメージファイル、WMIなどのJDBC / ODBCドライバーがあるため、ソースはDBMSとしてだけでなく理解できます。
簡単に言うと、 CachéSQLゲートウェイの使用方法:
- システム管理ポータル ( SMP )で、接続文字列、ログイン、パスワードなどを指定して、目的のタイプの接続を作成します。 ここで、作成された接続を確認できます。
- バインドウィザードを使用して、上記のステップの接続を使用して、外部DBMSから必要なテーブルやプロシージャをCachéに接続します。 この場合、データはどこにもコピーされませんが、特別な仮想クラスのみが作成され、それらもテーブルです。
- これで、 エリア (Cachéの論理データベース)に接続すると、外部ソース(Oracle、DB2、MSSQL、MySQL、Excel、DBF、CSVなど)のテーブル、ビュー、ストアドプロシージャ(CI)が表示されます。
- さらに、Cachéに物理的に配置されているかのように、これらのテーブル/ HPを双方向で操作できます。
注:異なるデータソースへの異種クエリのサポートに関する質問を予想して、クエリにいくつかの制限が存在することに気付きました。
つまり、OracleとMSSQLのテーブル間のJOINは失敗します。
これらの制限は、いわゆるリンクテーブルにのみ適用されます。 バインドウィザードの代わりに構造とデータの移行 ウィザードを使用する場合、そのような制限はありません。
リンクテーブルの作成
上記のように、ODBCまたはJDBCドライバーを使用して、外部データソースに接続できます。 両方のオプションを検討してください。
ODBCの場合、最初にシステムDSNを構成する必要があります。
また、 JDBCの 場合-Java仮想マシンへのパス( 以下、すべての画像をクリック可能 ):
次に、SMPで、特定の設定が依存する希望のタイプ( JDBCまたはODBC )のCachéSQL ゲートウェイの接続を作成する必要があります。 ここで、新しく作成された接続を確認できます。
次に、 テーブルまたはプロシージャ をリンクするウィザードを使用して、必要な仮想テーブルまたはXPを作成する必要があります。
ウィザードは、各テーブルに新しい名前、各フィールドの新しい名前、主キーなどを要求します。 ほとんどの場合、デフォルトですべての名前を残すことができますが、これらの識別子の一部がCachéDBMSの予約語である場合があります。
外部job_titlesテーブル用に生成された仮想クラスの例:
クラスdbo.jobtitles Extends%Library.Persistent [ ClassType = persistent、 Not ProcedureBlock 、 SqlRowIdPrivate 、 SqlTableName = job_titles 、 StorageStrategy = GSQLStorage]
{
パラメーター CONNECTION = "ems、NOCREATE" ;
パラメーター EXTDBNAME = "Microsoft SQL Server" ;
パラメーター EXTERNALTABLENAME = "dbo.job_titles" ;
プロパティ INTERETHNICVALUE As%String ( EXTERNALSQLNAME = "INTERETHNIC_VALUE" 、 EXTERNALSQLTYPE = 12 、 MAXLEN = 50 )[ 必須 、 SqlColumnNumber = 5、 SqlFieldName = INTERETHNIC_VALUE ];
プロパティ INTERNATIONALVALUE As%String ( EXTERNALSQLNAME = "INTERNATIONAL_VALUE" 、 EXTERNALSQLTYPE = 12 、 MAXLEN = 50 )[ 必須 、 SqlColumnNumber = 4、 SqlFieldName = INTERNATIONAL_VALUE ];
プロパティ NATIONALVALUE As%String ( EXTERNALSQLNAME = "NATIONAL_VALUE" 、 EXTERNALSQLTYPE = 12 、 MAXLEN = 50 )[ 必須 、 SqlColumnNumber = 6、 SqlFieldName = NATIONAL_VALUE ];
プロパティ id As%整数 ( EXTERNALSQLNAME = "id" 、 EXTERNALSQLTYPE = 4 )[ 必須 、 SqlColumnNumber = 2、 SqlFieldName = id ];
プロパティの 優先度 As%整数 ( EXTERNALSQLNAME = "priority" 、 EXTERNALSQLTYPE = 4 )[ 必須 、 SqlColumnNumber = 3、 SqlFieldName = priority ];
インデックス MainIndex On id [ IdKey 、 PrimaryKey ];
}
注:必要に応じて、生成されたクラスのコードを、Cachéからの利点(フィールド、スーパークラス、およびCPによって計算されるクラスおよび/またはオブジェクトのメソッド)で補完できます。
ただし、関連テーブル/ XPを再生成すると、追加のコードがすべて失われることを忘れないでください。
これで、任意のODBC / JDBCクライアントを使用してCachéに接続し( 以前の記事のいずれかを参照)、内部および外部のすべてのテーブルとプロシージャを表示できます。 それらの違いをすぐに判断することは困難です。
もちろん、さまざまなDBMSのネイティブSQL構文を使用して、データを挿入/削除/変更できます。
CachéSQLゲートウェイは、 DeepSeeの組み込みビジネスインテリジェンスにも使用できますが、それは別のトピックです。
代替ユースケース
このテクノロジーは、同僚が他のDBMS(Cachéではなく)で作業するのに役立ちました。 2人の新しい従業員が働きに来て、異なるサーバー上の複数の異なるデータベースにアクセスする必要がありました。
必要なサーバーへのアクセスを開くためのペーパーがキャビネットを「さまよっ」て、期限が切れていたため、管理者の同意を得て、Cachéの一時的なオプションを提供しました。幸いなことに、Hibernateのようなフレームワークを使用し、必要なものにアクセスできましたサーバーへ。 Cachéで領域を作成し、必要なデータベースから必要なテーブルを追加して、必要な権限を付与しました。
次に、ここでプロキシDBMSとして機能するCachéを介して1つの仮想データベースに接続し、異なるデータベースのテーブルでこのように作業しました。 同僚は、DBMSのドライバーをインストールする必要さえありませんでした。
必要なサーバーへのアクセスを開くためのペーパーがキャビネットを「さまよっ」て、期限が切れていたため、管理者の同意を得て、Cachéの一時的なオプションを提供しました。幸いなことに、Hibernateのようなフレームワークを使用し、必要なものにアクセスできましたサーバーへ。 Cachéで領域を作成し、必要なデータベースから必要なテーブルを追加して、必要な権限を付与しました。
次に、ここでプロキシDBMSとして機能するCachéを介して1つの仮想データベースに接続し、異なるデータベースのテーブルでこのように作業しました。 同僚は、DBMSのドライバーをインストールする必要さえありませんでした。
外部データへのプログラムによるアクセス
関連テーブルの作成に加えて、外部データをプログラムで操作できます。
システムDSNを使用したODBCソフトウェアアクセスの例:
set db = ## class ( %SQLGatewayConnection )。 %新規 ()
res = dbを 設定し ます。 接続 ( "DSNName" 、 "ユーザー名" 、 "パスワード" )
rs = ##クラス ( %ResultSet )を設定します。 %新規 ( "%DynamicQueryGW:SQLGW" )
rsを行います 準備 ( 「SELECT * FROM users WHERE id =?」 、、 db)
rsを行います 実行 (46)
rs 次 () {
i = 1:1:rsの場合。 GetColumnCount () {
rsを 書き ます。 GetData (i)
i '= rsの 場合 。 GetColumnCount () {
「、」と 書く
} else {
書き ます!
}
}
}
dbを行います。 切断 ()
この場合、 "DSNName"はOC自体で定義されたDSN名であるため、CachéSQL Gatewayの接続を作成する必要はなくなりました。
上記の例は、 %ResultSet クラスと%DynamicQueryGWクラスを使用してODBCを操作するためのいわゆる高レベルアクセスを示していますが、低レベルアクセスも可能です。 この場合、 %SQLGatewayConnectionクラスのメソッドのみが使用されます。
以下は、低レベルアクセスを使用した外部テーブルへのクエリの例です。 このクエリは、フィールドの値がAge = 21で、 名前フィールドの値が文字「D」で始まる外部ODBCソース(名前DSNName )のINFOテーブルからすべてのフィールドを選択します。
set db = ## class ( %SQLGatewayConnection )。 %新規 ()
//接続を確立します
dbを行います。 接続 ( "DSNName" 、 "sa" 、 "pwd" )
//新しいチームを作成します
sc = dbを 設定し ます。 AllocateStatement (.Stat)
//リクエストを準備します
sc = dbを 設定し ます。 準備 (統計、 「SELECT * FROM INFO WHERE Age =?AND Name LIKE?」 )
//パラメータの準備
sc = dbを 設定し ます。 BindParameters (Stat、 $ listbuild (1,1)、 $ listbuild ( 4,12 )、 $ listbuild (4,50)、 $ listbuild (0,0)、 $ listbuild (4,50))
sc = dbを 設定し ます。 SetParameter (統計、 $ listbuild (21)、1)
sc = dbを 設定し ます。 SetParameter (Stat、 $ listbuild ( "D%" )、2)
//クエリの実行
sc = dbを 設定し ます。 実行 (統計)
{
quit : 'db。 フェッチ (統計)
sc = dbを 設定し ます。 GetOneRow (統計、.Row)
j = 1:1: $ listlength (Row) write $ listget (Row、j)_ ""
書き ます!
}
//コマンドを削除します
sc = dbを 設定し ます。 DropStatement (統計)
//切断します
sc = dbを 設定し ます。 切断 ()
したがって、この例をより詳細に検討してください。
•ODBCデータソース(DSN)に接続するには、 Connectメソッド(DSN、ユーザー、パスワード)を使用します 。
set db = ## class ( %SQLGatewayConnection )。 %新規 ()
//接続を確立します
dbを行います。 接続 ( "DSNName" 、 "sa" 、 "pwd" )
•切断するには、 Disconnect()メソッドを使用します。
sc = dbを 設定し ます。 切断 ()
•クエリを実行する前に、最初にStatementコマンドを作成する必要があります。 コマンドを作成するには、 AllocateStatement()メソッドを使用し、 AllocateStatement()メソッドへのHandle引数を参照で渡します(引数名の前にドット「。」を置く必要があります)。
sc = dbを 設定し ます。 AllocateStatement (.Stat)
•コマンドを削除するには、 DropStatement()メソッドを使用します。
sc = dbを 設定し ます。 DropStatement (統計)
•クエリを実行する前に、 準備(Stat、sql)メソッドが使用される「準備済み」である必要があります。 メソッドの引数として、作成されたコマンドとsql-query文字列が渡されます。 パラメータを使用してクエリを実行することが可能で、その後、パラメータの代わりに「?」記号がsql行に挿入されます。
//リクエストを準備します
sc = dbを 設定し ます。 準備 (統計、 「SELECT * FROM INFO WHERE Age =?AND Name LIKE?」 )
•パラメータ付きのsqlクエリが送信される場合、これらのパラメータを準備し、特定の値を割り当てる必要があります。 パラメーターを準備するには、 BindParameters()メソッドを使用します。 BindParameters()メソッドの引数:
- 作成されたチーム。
- パラメーターのタイプ:1-in(入力)、2-in / out(入力/出力)、4-out(出力、...);
- ODBCデータ型のリスト(例:4-INTEGER、9-DATE、12-VARCHAR、8-DOUBLE、...);
- バイト単位のバッファサイズ。
- ピリオドの後の文字数(10進および浮動小数点のみ);
- バイト単位のデータ型の長さのリスト。
• BindParameters()メソッドの2番目から始まるすべての引数は%List型であり、 $ listbuild()関数に引数として渡す必要があります。 リクエストに複数のパラメータがある場合、引数$ listbuild()には、クエリ行に表示される順序で各パラメータに対応するカンマで区切られた値が渡されます。次に例を示します。
sc = dbを 設定し ます。 BindParameters (Stat、 $ listbuild (1,1)、 $ listbuild ( 4,12 )、 $ listbuild (4,50)、 $ listbuild (0,0)、 $ listbuild (4,50))
または
#include %occODBC ; 必要なファイルをマクロに接続することを忘れないでください
sc = dbを 設定し ます。 BindParameters (
スタット
$ listbuild ( $$$ SQLPARAMINPUT 、 $$$ SQLPARAMINPUT )、
$ listbuild ( $$$ ODBCTYPEinteger 、 $$$ ODBCTYPEvarchar )、
$ listbuild (4,50)、
$ listbuild (0,0)、
$ listbuild (4,50)
)
注:最初に示したコードでは、パラメータータイプの数値識別子が使用されています。 実際のコードでは、 %occODBC.incまたは%msql.incファイルのマクロを使用することをお勧めします 。例:
- $$$ GetOdbcTypeNumber( "INTEGER")または$$$ ODBCTYPEintegerは4を返します。
- $$$ SQLPARAMINPUTは1(入力)を返します。
- $$$ SQLPARAMINPUTOUTPUTは2(入力/出力)を返します。
- $$$ SQLPARAMOUTPUTは4(出力)を返します。
- など
マクロの完全なリストは、 Cachéスタジオなどを使用して、対応するファイルにあります 。
•パラメーターへの値の割り当ては、 SetParameter(Stat、$ listbuild(val)、Numb)メソッドを使用して実行されます。 次の引数がSetParameter()メソッドに渡されます。
- 作成されたチーム。
- 関数への引数としてのパラメータ値$ listbuild() ;
- クエリ文字列内のパラメーターのシリアル番号。
•渡されたパラメーターごとにSetParameter()メソッドが個別に呼び出されます。
sc = dbを 設定し ます。 SetParameter (統計、 $ listbuild (21)、1)
sc = dbを 設定し ます。 SetParameter (Stat、 $ listbuild ( "D%" )、2)
•要求を実行するには、作成されたコマンドが引数として渡されるExecute(Stat)メソッドが使用されます。
sc = dbを 設定し ます。 実行 (統計)
注:JDBC / ODBCを使用した外部データへのプログラムによるアクセスの追加例は、それぞれ%UnitTest.JDBCSQLおよび%UnitTest.ODBCSQLクラスのソースコードにあります。