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


10

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インポートおよびエクスポートウィザードもOLE DBに依存しているようで、同じテーブルを使用します
  • 問題が文字セットの使用に依存するかどうかを自問していますが、変更することはできません
  • 実際的な回避策として、PowerShellスクリプトをいくつか使用してデータを取得しますが、

少なくとも最初に変換できる場合は、CLOBを読み取ることができるはずです... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

回答:


3

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

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

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

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


2

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

次のステートメントを含む古いMicrosoftサポートの投稿へのリンクが含まれています

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
    }
}

ところで:コードはチャドミラーの本当にシンプルなデータディクショナリcodeplexプロジェクトに基づいています

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

インポート/エクスポートウィザードもリンクサーバーも使用できませんでした。


それを考えるとうんざりするgrrrrは、それ以来、ORAの3ポイントリリースとMSの少なくとも1ポイントリリースです... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

マイクロソフトがこの問題を修正できない理由が本当にわかりません。同じ理由で、MicrosoftがドットネットフレームワークのOracleクライアントライブラリのサポートを停止しました。過去に容赦なく彼らの応答を言い換えると、「他の人々はそれをより良くする」のです。ふたりの間で愛が失われることはないと私は言います。
ScottCher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.