Почему я не могу прочитать столбцы Oracles CLOB через связанный сервер SQL-SERVER 2008?

10

Я хочу получить доступ к данным в базе данных Oracle 11g из SQL-Server 2008

Я установил связанный сервер, и когда я выполняю

select * from [Link_server_name]..Oracle_schema.Oracle_table

Oracle_table содержит столбцы Number и varchar2, все работает как исключение.

Но когда Oracle_table содержит столбец CLOB, я получаю следующую ошибку:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Неуказанная ошибка' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' для Verbindungsserver 'L_V407SR8T' hat die Meldung 'Произошла ошибка Oracle, но не удалось получить сообщение об ошибке из Oracle.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' для Verbindungsserver 'L_V407SR8T' hat die Meldung 'Тип данных не поддерживается.' zurückgeben.

Сообщение 7306, уровень 16, состояние 2, строка 1

Die '"MCCAPP". "DOGGRUPPEN"' - Tabelle vom OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' kann nicht geöffnet werden.

Использование OPENQUERY

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

я получил

Der OLE DB-Anbieter 'MSDAORA' для Verbindungsserver 'L_V407SR8T' hat die Meldung 'Произошла ошибка Oracle, но не удалось получить сообщение об ошибке из Oracle.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' для Verbindungsserver 'L_V407SR8T' hat die Meldung 'Тип данных не поддерживается.' zurückgeben.

Пожалуйста, извините немецкие сообщения об ошибках.

Мой вопрос: есть ли способ прочитать столбцы CLOB через связанные серверы?

РЕДАКТИРОВАТЬ:

  • Мастер импорта и экспорта SQL Server, похоже, тоже зависит от OLE DB и сосет в тех же таблицах
  • Я спрашиваю себя, зависит ли проблема от использования наборов символов, но я не могу их изменить
  • В качестве практического решения я использую некоторые скрипты PowerShell для получения данных, но
bernd_k
источник
Вы должны быть в состоянии прочитать CLOB, если, по крайней мере, сможете сначала преобразовать его ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Ответы:

3

Загрузите и установите клиент базы данных Oracle 11 на свой компьютер с SQL Server 2008.

Настройте связанный сервер с помощью поставщика Oracle OLE DB (OraOLEDB.Oracle).

Убедитесь, что «Разрешить InProcess» включен в настройках провайдера.

Клиент Oracle 11 OLE DB поддерживает CLOB.

Серж А.
источник
2

Комментарий к ответу ТАК вопрос Как читать столбец CLOB в Oracle с помощью OleDb?

содержит ссылку на старый пост службы поддержки Microsoft со следующим утверждением

Специфичные для Oracle 8.x типы данных, такие как CLOB, BLOB, BFILE, NCHAR, NCLOB и NVARCHAR2, не поддерживаются.

Было бы неплохо найти еще несколько текущих ссылок.

Я провел некоторые исследования Google и нашел только обходные пути. Я боюсь, что тип данных по-прежнему не поддерживается.

Изменить 05/05/2011

Я действительно не понимаю, почему Microsoft не может решить эту проблему. Следующий скрипт PowerShell использует OLE-DB для чтения таблицы, содержащей столбец CLOB, из базы данных Oracle и вставки данных в существующую аналогичную таблицу на Sql-Server с использованием bulkCopy, что является очень эффективным способом.

Настройте следующие строки подключения, запрос и имя таблицы для вашей установки:

# 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"

Следующий код копирует таблицу оракула в таблицу sql-сервера

$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 # или каких-либо сторонних инструментов.

Мне не удалось использовать ни мастера импорта / экспорта, ни связанных серверов.

bernd_k
источник
Грррр, это отстой, учитывая, что с тех пор было три релиза для ORA и, по крайней мере, один балл для MS ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand
Я действительно не понимаю, почему Microsoft не может решить эту проблему ? По той же причине Microsoft перестала поддерживать клиентскую библиотеку Oracle в рамках dotnet - «другие люди делают это лучше», если я безжалостно перефразирую их ответы в прошлом. Я не скажу вам, что любовь между этими двумя потерянна.
ScottCher