フェデレーションシステムまたはマルチベースを作成するためのCachéSQLゲートウェイの紹介

複雑で複雑なシステムでは、さまざまなソースからのデータを統合するという問題がしばしば発生します。

このようなシステムは、 統合、統合、またはマルチベースと呼ばます。



CachéDBMSでは、このような統合は、外部データソースへのODBC / JDBC接続を使用する特別なゲートウェイ( CachéSQLゲートウェイ )を使用して実行されます。 さらに、この場合、MS Excel、DBF、テキストファイル、イメージファイル、WMIなどのJDBC / ODBCドライバーがあるため、ソースはDBMSとしてだけでなく理解できます。



簡単に言うと、 CachéSQLゲートウェイの使用方法:



  1. システム管理ポータルSMP )で、接続文字列、ログイン、パスワードなどを指定して、目的のタイプの接続を作成します。 ここで、作成された接続を確認できます。
  2. バインドウィザードを使用して、上記のステップの接続を使用して、外部DBMSから必要なテーブルやプロシージャをCachéに接続します。 この場合、データはどこにもコピーされませんが、特別な仮想クラスのみが作成され、それらもテーブルです。
  3. これで、 エリア (Cachéの論理データベース)に接続すると、外部ソース(Oracle、DB2、MSSQL、MySQL、Excel、DBF、CSVなど)のテーブル、ビュー、ストアドプロシージャ(CI)が表示されます。
  4. さらに、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のドライバーをインストールする必要さえありませんでした。



外部データへのプログラムによるアクセス



関連テーブルの作成に加えて、外部データをプログラムで操作できます。



システム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()メソッドの引数:





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()メソッドに渡されます。





•渡されたパラメーターごとにSetParameter()メソッドが個別に呼び出されます。



sc = dbを 設定し ます。 SetParameter (統計、 $ listbuild (21)、1)

sc = dbを 設定し ます。 SetParameter (Stat、 $ listbuild "D%" )、2)



•要求を実行するには、作成されたコマンドが引数として渡されるExecute(Stat)メソッドが使用されます。



sc = dbを 設定し ます。 実行 (統計)



注:JDBC / ODBCを使用した外部データへのプログラムによるアクセスの追加例はそれぞれ%UnitTest.JDBCSQLおよび%UnitTest.ODBCSQLクラスのソースコードにあります。



All Articles