フェデレーションシステムまたはマルチベースを作成するための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クラスのソースコードにあります。

Source: https://habr.com/ru/post/J148944/


All Articles