ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
MDB 接続で書く別スキーマ間のテーブルコピーの為のSQL ( No.13 )
日時: 2008/07/12 17:03
名前: lightbox



この記事は、こちらの続きとして書かれています

この方法は、ADO の Microsoft.Jet.OLEDB.4.0 にテーブルをコピーさせる方法です。
まず、SQL の窓のツールバーより「A」ボタンをクリックして以下の場所の MDB を開いて下さい
(winofsql.exeがあるディレクトリ)\Tool\parts\販売管理B.mdb
( MDB ならばなんでも良いです ) そして、以下のようなコピー用のSQLを作成して、テキストエリアにセットし、テキストエリアの 左下にある実行ボタンで実行して下さい。
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[社員マスタ]
ここで、注意するべきは、実行前に COPY_OUT 側で社員マスタが存在しない事です。 存在している場合はエラーになります。もし、追加処理を行いたい場合は insert into 〜 select * from 〜 の構文を使います。 また、当然ですが、作成されたテーブルに主キーは存在しません。
最も重要なのは、二つの DSN を使用しなければならない事と、
ユーザが SELECT ANY TABLE 権限を持たない事です
では、もし片方の( ここでは、lightbox )が、SELECT ANY TABLE 権限を持っているとした場合、 上記記述が以下のように変化します。
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
こうしなければならない理由は、Microsoft にまかせると、SELECT ANY TABLE 権限を持った ユーザーでは、Oracle 全体で同名のテーブルがあると、テーブルを特定できずにエラー となるからです。その場合は上記のようにスキーマで修飾しなければなりません。 ですから、上記処理で lightbox. をつけなくても「たまたま」うまくいく場合がありますが、 それは、たまたま他のスキーマに同名のテーブルが無かったからという事になります
いずれにしても、Microsoft.Jet.OLEDB.4.0 を使った MDB 接続上では、
いろいろな他の RDBMS と同時接続して、あたかも MDB 内に全てあるかのように
結合したりする事もできます。( SQLServer と Oracle のテーブルを結合等 )

また、当然ですが、Microsoft.Jet.OLEDB.4.0 は Microsoft の 製品と親和性が高いので
Excel や MDB へのデータエクスポートは容易です
Oracle のデータを Excel へ出力
select * 
into [Excel 8.0;DATABASE=C:\TMP\EXPORT001.xls].[社員マスタ] 
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]