Чому я не можу читати стовпці Oracles CLOB через пов'язаний сервер SQL-SERVER 2008?


10

Я хочу отримати доступ до даних у базі даних Oracle 11g із SQL-Server 2008

Я встановлюю пов'язаний сервер і коли виконую

select * from [Link_server_name]..Oracle_schema.Oracle_table

і Oracle_table містить стовпці "Кількість" та "varchar2", і всі вони працюють як виключені.

Але коли Oracle_table містить стовпець CLOB, я отримую таку помилку:

Der OLE DB-Anbieter 'MSDAORA' для 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.

Msg 7306, рівень 16, стан 2, рядок 1

Die "" MCCAPP "." DOGGRUPPEN "'- Tabelle vom OLE DB-Anbieter' MSDAORA 'für den Verbindungsserver' L_V407SR8T 'cann 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, щоб отримати дані, але

Ви можете мати змогу прочитати CLOB, якщо ви хоч би зможете його перетворити спочатку ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Відповіді:


3

Завантажте та встановіть клієнт бази даних Oracle 11 на свій апарат SQL Server 2008.

Налаштуйте зв’язаний сервер за допомогою постачальника баз даних Oracle OLE (OraOLEDB.Oracle).

Переконайтеся, що "Дозволити InProcess" увімкнено в параметрах постачальника.

Клієнт DB OLE 11 OLE підтримує CLOB.


2

Коментар до відповіді ТАК Питання Як читати стовпець CLOB в Oracle за допомогою OleDb?

містить посилання на старий пост служби підтримки Microsoft із наступним твердженням

Специфічні для Oracle 8.x типи даних, такі як CLOB, BLOB, BFILE, NCHAR, NCLOB та NVARCHAR2, не підтримуються.

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

Я зробив кілька досліджень Google і знайшов лише обхідні шляхи. Я боюся, що тип даних все ще не підтримується.

Редагувати 05.02.2011

Я дійсно не розумію, чому Microsoft не в змозі виправити цю проблему. Наведений нижче сценарій PowerShell використовує OLE-DB для читання таблиці, що містить стовпець CLOB з бази даних Oracle і вставки даних у існуючу подібну таблицю на Sql-сервері за допомогою 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"

Наступний код копіює таблицю oracle у таблицю 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
    }
}

BTW: код заснований на проекті Codeplex Chad Millers Really Simple Data Dictionary

В даний час використання PowerShell - це єдиний спосіб, коли я можу копіювати дані за допомогою CLOB з Oracle на Sql-Server, не використовуючи C # або будь-які сторонні інструменти.

Мені не вдалося використовувати ні Майстра імпорту / експорту, ні пов'язаних серверів.


grrrr, який смокче, враховуючи, що минуло три точкові релізи для 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 Framework - "інші люди роблять це краще", якщо я безжалісно перефразовую їх відповіді в минулому. Я кажу вам, що між цими двома людьми не втрачено кохання.
ScottCher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.