ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: MDB 接続で書く別スキーマ間のテーブルコピーの為のSQL
名前: lightbox
処理選択
パスワード

件名 MDB 接続で書く別スキーマ間のテーブルコピーの為のSQL
名前 lightbox
コメント
※ http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view2&f=249&no=12&type=ref&opt=text-align:left;margin-left:5px;&xml=y(この記事は、こちらの続きとして書かれています)

@DIV
この方法は、ADO の Microsoft.Jet.OLEDB.4.0 にテーブルをコピーさせる方法です。
@END

まず、SQL の窓のツールバーより「A」ボタンをクリックして以下の場所の MDB を開いて下さい
@DIV
(winofsql.exeがあるディレクトリ)\Tool\parts\販売管理B.mdb
@END
( MDB ならばなんでも良いです )

そして、以下のようなコピー用のSQLを作成して、テキストエリアにセットし、テキストエリアの
左下にある実行ボタンで実行して下さい。
@DIV
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[社員マスタ]
@END

ここで、注意するべきは、実行前に COPY_OUT 側で社員マスタが存在しない事です。
存在している場合はエラーになります。もし、追加処理を行いたい場合は
[[insert into 〜 select * from 〜 ]] の構文を使います。
また、当然ですが、作成されたテーブルに主キーは存在しません。

@DIV
最も重要なのは、二つの DSN を使用しなければならない事と、
ユーザが SELECT ANY TABLE 権限を持たない事です
@END

では、もし片方の( ここでは、lightbox )が、SELECT ANY TABLE 権限を持っているとした場合、
上記記述が以下のように変化します。

@DIV
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
@END

こうしなければならない理由は、Microsoft にまかせると、SELECT ANY TABLE 権限を持った
ユーザーでは、Oracle 全体で同名のテーブルがあると、テーブルを特定できずにエラー
となるからです。その場合は上記のようにスキーマで修飾しなければなりません。
ですから、上記処理で lightbox. をつけなくても「たまたま」うまくいく場合がありますが、
それは、たまたま他のスキーマに同名のテーブルが無かったからという事になります

@DIV
いずれにしても、Microsoft.Jet.OLEDB.4.0 を使った MDB 接続上では、
いろいろな他の RDBMS と同時接続して、あたかも MDB 内に全てあるかのように
結合したりする事もできます。( SQLServer と Oracle のテーブルを結合等 )

また、当然ですが、Microsoft.Jet.OLEDB.4.0 は Microsoft の 製品と親和性が高いので
Excel や MDB へのデータエクスポートは容易です
@END


[[Oracle のデータを Excel へ出力]]
@DIV
select * 
into [Excel 8.0;DATABASE=C:\TMP\EXPORT001.xls].[社員マスタ] 
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
@END