- PR -

別データベース間での処理

投稿者投稿内容
homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 2005-10-15 15:48
よろしくお願いします。

データベースが複数あり、オラクル・SQLServerと分かれている場合で
オラクルのデータを抽出する際、SQLServerに入っているデータは抽出しない
といった事は可能でしょうか。

オラクル側
顧客ID
氏名

SQLServer側
顧客ID
氏名

上記の構成で成り立っている別データベースがあり、
オラクルのデータを抽出する際、SQLServer側に存在する顧客ID
は含ませないといった芸当をしたいのですが、可能でしょうか。
同じデータベースならSQL文でサクッと行くところなのですが、
なかなか良いアイデアが浮かびません。
どなたか良きアドバイスをお願い致します。

環境はASP.NET(VB.NET)
で実現しようと考えております。



ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-10-15 16:05
SQLでしたいのでしたら、SQL鯖はLinked Server(リンクサーバー)の機能使えば出来るはずです。Oracleも似たような機能を持っているはずです。
homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 2005-10-15 16:17
さっそくの返信恐れ入ります。

先程の条件はSQL文を使うといった訳ではありません。
SQL文だったら楽だったのにといった意味の私のグチの
様な物だと解釈していただければ幸いです。

処理としてはVB上での処理が出来ればと思っております。
要望を後から書込み誠に申し訳ありません。

上司には、
『オラクル側には何もするな』と
言われてしまい、途方に暮れそうです。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-10-15 16:35
ならSQL鯖側でLinked Serverを使えばいいと思うのですけど…homesさんの想定環境が分からないので思いついた2つの手段を書きます

1.LinkedServerを使う
SQL ServerでOracleにLinkする。
後はSelectするときにSQLServerにつないで

コード:


SELECT * FROM [Oracle].[顧客情報]
WHERE
[ID] NOT IN (SELECT [ID] FROM [顧客情報])




2.クライアント側で消す
これはコードで。

コード:

DataTable oracle = new DataTable();
DataTable sqlsvr = new DataTable();

oracle_adapter.Fill(oracle);
sqlsvr_adapter.Fill(sqlsvr);

foreach(DataRow row in oracle.Rows) {
if(sqlsvr.Select( string.Format("ID = {0}", row["ID"]) ).Length>0) {
row.Delete();
}
}
oracle.AcceptChanges();




# ただしこのコード重いので2分木とかのコレクション使ったやつに書き換えて
# ください


[ メッセージ編集済み 編集者: ya 編集日時 2005-10-15 16:42 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-15 16:47
こんにちは。

もの凄く単純に考えるならば…。
SQLServerの方から顧客IDを全て取得して、それを取得条件から外すように動的にクエリを作成して、Oracleの方から取得する…とか。
顧客IDぐらいなら全部とってもいいかな、と思ったり。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-10-15 17:31
こんなんでどうですか?

1)OracleとMSSQLの両方にコネクションオープン
2)両方に対してクエリ実行、この際顧客IDでORDER BYしておく
3)Oracleから1件Fetch
4)3の顧客ID以上の値が見つかるまで、MSSQLからFetchを繰り返す
5)ぴったり同じ顧客IDが見つかれば、何もせずに3に戻る
6)そうでなければ3のレコードを処理して、再び3へ

クエリは1回ずつしか発行しないし、アプリ側でメモリも使わないので、結構効率いいと思いますが。
homes
常連さん
会議室デビュー日: 2002/08/06
投稿数: 38
投稿日時: 2005-10-17 17:55
返信遅くなり申し訳ありません。

皆様から頂いた返信を参考にいろいろ試していましたが
結局リンクサーバーを使う事にしました。
カーニーさん、囚人さん、yaさんのクライアント側で消す
手法等、目的の表示はするのですが、表示するまでにウチの
へっぽこサーバーでは表示されるまで時間が多少かかりました。

上司にはSQLServerからのリンクも駄目と言われたのですが、
この手法の方が新たなコードを作成する必要性が無く、
SQL一回で処理できるので効率重視だとこの方法かなと・・・。
上司には内緒ですが、こっそりリンクを作成致しました。

皆さんにはいろいろ考えて頂いたのに結局別の手法をとってしまい
申し訳ありませんでした。
上司にばれた際には「だったら性能良いサーバー買って下さいよ」
って言います。

いろいろ教えて頂いた方法は高性能なサーバーが導入された際に実現
できたらなと思います。
本当にありがとうございました。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-17 18:06
本題から逸れますが少し。

逆かな。

上司が何かしらの理由で「SQLServerからのリンクも駄目」と言ったなら、とりあえずは「へっぽこサーバーでは表示されるまで時間が多少かかりました」の方策を採り、上司に「遅い」と言われたら、「リンクサーバーを使う」か「だったら性能良いサーバー買って下さいよ」にしたほうが良さそうな気がしますね。

それか、実装する前に「リンクサーバーを使った方が速いからそっちでやった方がいい」と説得する方がいいですね。

スキルアップ/キャリアアップ(JOB@IT)