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

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.