Perché non riesco a leggere le colonne CLOB di Oracles tramite il server collegato SQL-SERVER 2008?


10

Voglio accedere ai dati in un database Oracle 11g da SQL-Server 2008

Ho impostato un server collegato e quando eseguo

select * from [Link_server_name]..Oracle_schema.Oracle_table

e Oracle_table contiene le colonne Number e varchar2, tutte funzionano come tranne.

Ma quando Oracle_table contiene una colonna CLOB, viene visualizzato il seguente errore:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Errore non specificato' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Si è verificato un errore Oracle, ma non è stato possibile recuperare il messaggio di errore da Oracle.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Il tipo di dati non è supportato.' zurückgeben.

Messaggio 7306, livello 16, stato 2, riga 1

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

Usando OPENQUERY

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

ottengo

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Si è verificato un errore Oracle, ma non è stato possibile recuperare il messaggio di errore da Oracle.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Il tipo di dati non è supportato.' zurückgeben.

Scusate i messaggi di errore tedeschi.

La mia domanda: esiste un modo per leggere le colonne CLOB tramite server collegati?

MODIFICARE:

  • L'importazione / esportazione guidata di SQL Server sembra dipendere anche da OLE DB e risucchia le stesse tabelle
  • Mi chiedo se il problema dipende dagli usi dei set di caratteri, ma non posso cambiarli
  • Come soluzione pratica, utilizzo alcuni script di PowerShell per ottenere i dati, ma

Si dovrebbe essere in grado di leggere il CLOB se è almeno possibile convertirlo prima ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Risposte:


3

Scarica e installa un client di database Oracle 11 sul tuo computer SQL Server 2008.

Configurare un server collegato utilizzando un provider Oracle OLE DB (OraOLEDB.Oracle).

Assicurarsi che "Consenti InProcess" sia abilitato nelle opzioni del provider.

Il client Oracle 11 OLE DB supporta CLOB.


2

Un commento a una risposta SO domanda Come leggere una colonna CLOB in Oracle usando OleDb?

contiene un collegamento al vecchio post del supporto Microsoft con la seguente dichiarazione

I tipi di dati specifici di Oracle 8.x, come CLOB, BLOB, BFILE, NCHAR, NCLOB e NVARCHAR2, non sono supportati.

Sarebbe bello trovare alcuni riferimenti più attuali.

Ho fatto alcune ricerche su Google e ho trovato solo soluzioni alternative. Temo che il tipo di dati non sia ancora supportato.

Modifica il 02/05/2011

Davvero non capisco perché Microsoft non sia in grado di risolvere questo problema. Il seguente script PowerShell utilizza OLE-DB per leggere una tabella contenente una colonna CLOB da un database Oracle e inserire i dati in una tabella simile esistente su SQL Server utilizzando bulkCopy, il che è un modo molto efficiente.

Regola le seguenti stringhe di connessione, query e nome tabella per la tua installazione:

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

Il codice seguente copia la tabella degli Oracle in una tabella 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
    }
}

A proposito: il codice si basa sul progetto codeplex di Chad Millers Really Simple Data Dictionary

Attualmente l'utilizzo di PowerShell è l'unico modo che conosco per copiare i dati con CLOB da Oracle a SQL Server senza utilizzare C # o altri strumenti di terze parti.

Non sono riuscito a utilizzare né l'importazione / esportazione guidata né i server collegati.


grrrr che fa schifo considerando che sono stati rilasciati tre punti per ORA e almeno un rilascio punti per MS da allora ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

Davvero non capisco perché Microsoft non è in grado di risolvere questo problema ? Per lo stesso motivo Microsoft ha smesso di supportare la libreria client Oracle dotnet framework - "altre persone lo fanno meglio", se in passato ho parafrasato senza pietà le loro risposte. Nessun amore perso tra quei due, te lo dico io.
ScottCher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.