web-dev-qa-db-ja.com

SQL-SERVER 2008リンクサーバー経由でOracleのCLOB列を読み取れないのはなぜですか?

SQL-Server 2008からOracle 11gデータベースのデータにアクセスしたい

リンクサーバーをセットアップし、実行時に

select * from [Link_server_name]..Oracle_schema.Oracle_table

oracle_tableにはNumber列とvarchar2列が含まれ、すべて例外として機能します。

しかし、Oracle_tableにCLOB列が含まれていると、次のエラーが発生します。

Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Unspecified error'zurückgeben。

Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracleエラーが発生しましたが、エラーメッセージをOracleから取得できませんでした。'zurückgeben。

Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Data type is not supported。'zurückgeben。

メッセージ7306、レベル16、状態2、行1

ダイ「 "MCCAPP"。 "DOGGRUPPEN" '-Tabelle vom OLE DB-Anbieter' MSDAORA 'fürden Verbindungsserver' L_V407SR8T 'kann nichtgeöffnetwerden。

OPENQUERYの使用

SELECT * FROM OPENQUERY([L_V407SR8T], 'Select CLOB_COLUMN from Oracle_table'  )

私は得る

Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracleエラーが発生しましたが、Oracleからエラーメッセージを取得できませんでした。'zurückgeben。Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Data type is not supported。'zurückgeben。

ドイツ語のエラーメッセージをご利用ください。

私の質問:リンクサーバーを介してCLOB列を読み取る方法はありますか?

編集:

  • SQL ServerのインポートとエクスポートWizardは、OLE DBにも依存しているようで、同じテーブルを使用します
  • 問題が文字セットの使用に依存しているかどうかを自問していますが、変更することはできません
  • 実際的な回避策として、PowerShellスクリプトをいくつか使用してデータを取得しますが、
10
bernd_k

SQL Server 2008マシンにOracle 11データベースクライアントをダウンロードしてインストールします。

Oracle OLE DBプロバイダー(OraOLEDB.Oracle)を使用してリンクサーバーを設定します。

プロバイダーオプションで[インプロセスを許可]が有効になっていることを確認します。

Oracle 11 OLE DBクライアントはCLOBをサポートしています。

3
Serge A.

回答へのコメントSO質問 OleDbを使用してOracleのCLOB列を読み取る方法

古い Microsoft Support へのリンクが含まれています。

CLOB、BLOB、BFILE、NCHAR、NCLOB、NVARCHAR2などのOracle 8.x固有のデータ型はサポートされていません。

さらにいくつかの最新の参考文献を見つけるといいでしょう。

Googleで調査を行ったところ、回避策しか見つかりませんでした。データ型がまだサポートされていないのではないかと心配です。

2011年2月5日編集

マイクロソフトがこの問題を修正できない理由を本当に理解していません。次のPowerShellスクリプトはOLE-DBを使用して、OracleデータベースからCLOB列を含むテーブルを読み取り、bulkCopyを使用してSql-Serverの既存の同様のテーブルにデータを挿入します。これは非常に効率的な方法です。

次の接続文字列、クエリ、テーブル名をインストールに合わせて調整します。

# Here I use OLE-DB to read the Oracle database
$ConnectionString ="Server=ignore;User Id=myUser;Password=myPassword;Data Source=myTns;Provider=OraOLEDB.Oracle;"

# Here I use .NET SqlClient
$SqlClientConnString = "Data Source=localhost;Initial Catalog=myDestinationDB;Integrated Security=True"

$sql = "select int_col, clob_col from TABLE_WITH_CLOB"
$tableName = "COPY_OF_CLOB_TABLE"

次のコードは、Oracleテーブルをsql-serverテーブルにコピーします。

$OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$OLEDBConn.open()
$readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn)
$readcmd.CommandTimeout = '300'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$OLEDBConn.close()
#Write-Output $dt


if ($dt)
{
    try
    {
        $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $SqlClientConnString
        $bulkCopy.DestinationTableName = $tableName
        $bulkCopy.BatchSize = 50000
        $bulkCopy.BulkCopyTimeout = 0
        $bulkCopy.WriteToServer($dt)
    }
    catch
    {
        $ex = $_.Exception
        #Write-LogMessage -Source 'Write-DataTable' -Message "$($connectionName):$ex.Message"
        Write-Error "Write-DataTable$($connectionName):$ex.Message"
        continue
    }
}

ところで:コードはチャドミラーズに基づいています Really Simple Data Dictionary codeplex project

現在、PowerShellを使用するのが、C#やサードパーティのツールを使用せずに、CLOBを含むデータをOracleからSQL Serverにコピーする唯一の方法です。

Import/Export Wizardもリンクサーバーも使用しませんでした。

2
bernd_k