Dlaczego nie mogę odczytać kolumn CLUB Oracles przez połączony serwer SQL-SERVER 2008?

10

Chcę uzyskać dostęp do danych w bazie danych Oracle 11g z SQL-Server 2008

Konfiguruję połączony serwer i kiedy wykonuję

select * from [Link_server_name]..Oracle_schema.Oracle_table

a Oracle_table zawiera kolumny Number i varchar2, wszystkie działają jak wyjątki.

Ale gdy tabela Oracle_tab zawiera kolumnę CLOB, pojawia się następujący błąd:

Der OLE DB-Anbieter „MSDAORA” für den Verbindungsserver „L_V407SR8T” hat die Meldung „Nieokreślony błąd” zurückgeben.

Der OLE DB-Anbieter „MSDAORA” für den Verbindungsserver „L_V407SR8T” hat die Meldung „Wystąpił błąd Oracle, ale komunikat o błędzie nie mógł zostać odzyskany z Oracle”. zurückgeben.

Der OLE DB-Anbieter „MSDAORA” für den Verbindungsserver „L_V407SR8T” hat die Meldung „Typ danych nie jest obsługiwany”. zurückgeben.

Msg 7306, poziom 16, stan 2, wiersz 1

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

Korzystanie z OPENQUERY

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

dostaję

Der OLE DB-Anbieter „MSDAORA” für den Verbindungsserver „L_V407SR8T” hat die Meldung „Wystąpił błąd Oracle, ale komunikat o błędzie nie mógł zostać odzyskany z Oracle”. zurückgeben. Der OLE DB-Anbieter „MSDAORA” für den Verbindungsserver „L_V407SR8T” hat die Meldung „Typ danych nie jest obsługiwany”. zurückgeben.

Proszę wybaczyć niemieckie komunikaty o błędach.

Moje pytanie: Czy jest jakiś sposób na odczyt kolumn CLOB przez połączone serwery?

EDYTOWAĆ:

  • Kreator importu i eksportu programu SQL Server wydaje się zależeć również od OLE DB i zasysa te same tabele
  • Zadaję sobie pytanie, czy problem zależy od użycia zestawów znaków, ale nie mogę ich zmienić
  • W ramach praktycznej pracy używam skryptów PowerShell, aby uzyskać dostęp do danych, ale
bernd_k
źródło
Powinieneś być w stanie odczytać CLOB, jeśli przynajmniej możesz go najpierw przekonwertować ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Odpowiedzi:

3

Pobierz i zainstaluj klienta bazy danych Oracle 11 na komputerze z programem SQL Server 2008.

Skonfiguruj połączony serwer za pomocą dostawcy Oracle OLE DB (OraOLEDB.Oracle).

Upewnij się, że opcja „Zezwól na przetwarzanie” jest włączona w opcjach dostawcy.

Klient Oracle 11 OLE DB obsługuje CLOB.

Serge A.
źródło
2

Komentarz do odpowiedzi Pytanie SO Jak czytać kolumnę CLOB w Oracle za pomocą OleDb?

zawiera link do starego postu pomocy technicznej Microsoft z następującym oświadczeniem

Typy danych specyficzne dla Oracle 8.x, takie jak CLOB, BLOB, BFILE, NCHAR, NCLOB i NVARCHAR2, nie są obsługiwane.

Byłoby miło znaleźć więcej aktualnych referencji.

Przeprowadziłem badania Google i znalazłem tylko obejścia. Obawiam się, że typ danych nadal nie jest obsługiwany.

Edytuj 02/05/2011

Naprawdę nie rozumiem, dlaczego Microsoft nie jest w stanie rozwiązać tego problemu. Poniższy skrypt PowerShell używa OLE-DB do odczytu tabeli zawierającej kolumnę CLOB z bazy danych Oracle i wstawienia danych do istniejącej podobnej tabeli na serwerze Sql-Server za pomocą bulkCopy, co jest bardzo wydajnym sposobem.

Dostosuj następujące parametry połączenia, zapytanie i nazwę tabeli do instalacji:

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

Poniższy kod kopiuje tabelę Oracle do tabeli serwera 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: kod oparty jest na projekcie Codeplex Chada Millersa naprawdę bardzo prostego słownika danych

Obecnie używanie programu PowerShell to jedyny sposób, w jaki wiem, aby kopiować dane z obiektami CLOB z Oracle na Sql-Server, który nie używa C # ani żadnych narzędzi innych firm.

Nie udało mi się użyć Kreatora importu / eksportu ani powiązanych serwerów.

bernd_k
źródło
grrrr, do bani, biorąc pod uwagę, że to trzy wydania dla ORA i przynajmniej jedno wydanie dla MS od tego czasu ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand
Naprawdę nie rozumiem, dlaczego Microsoft nie jest w stanie rozwiązać tego problemu ? Z tego samego powodu Microsoft przestał obsługiwać bibliotekę kliencką Oracle dotnet Framework - „inni ludzie robią to lepiej”, jeśli bezwzględnie parafrazuję ich odpowiedzi w przeszłości. Mówię wam, że nie ma między nimi miłości.
ScottCher