¿Por qué no puedo leer las columnas CLOB de Oracles a través del servidor vinculado SQL-SERVER 2008?

10

Quiero acceder a datos en una base de datos Oracle 11g de SQL-Server 2008

Configuré un servidor vinculado y cuando ejecuto

select * from [Link_server_name]..Oracle_schema.Oracle_table

y Oracle_table contiene columnas Number y varchar2, todas funcionan como excepciones.

Pero cuando Oracle_table contiene una columna CLOB, obtengo el siguiente error:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Error no especificado' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Ocurrió un error de Oracle, pero no se pudo recuperar el mensaje de error de Oracle'. zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'El tipo de datos no es compatible'. zurückgeben.

Mensaje 7306, Nivel 16, Estado 2, Línea 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'  )

yo obtengo

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Ocurrió un error de Oracle, pero no se pudo recuperar el mensaje de error de Oracle'. zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'El tipo de datos no es compatible'. zurückgeben.

Por favor, disculpe los mensajes de error alemanes.

Mi pregunta: ¿hay alguna forma de leer columnas CLOB a través de servidores vinculados?

EDITAR:

  • El Asistente de importación y exportación de SQL Server también parece depender de OLE DB y apesta en las mismas tablas
  • Me pregunto si el problema depende de los usos de los juegos de caracteres, pero no puedo cambiarlos.
  • Como solución práctica, utilizo algunos scripts de PowerShell para obtener los datos, pero
bernd_k
fuente
Debería poder leer el CLOB si al menos puede convertirlo primero ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Respuestas:

3

Descargue e instale un cliente de base de datos Oracle 11 en su máquina SQL Server 2008.

Configure un servidor vinculado utilizando un proveedor Oracle OLE DB (OraOLEDB.Oracle).

Asegúrese de que "Permitir proceso" esté habilitado en las opciones del proveedor.

El cliente Oracle 11 OLE DB es compatible con CLOB.

Serge A.
fuente
2

Un comentario a una respuesta SO pregunta ¿Cómo leer una columna CLOB en Oracle usando OleDb?

contiene un enlace a la antigua publicación de soporte de Microsoft con la siguiente declaración

No se admiten tipos de datos específicos de Oracle 8.x, como CLOB, BLOB, BFILE, NCHAR, NCLOB y NVARCHAR2.

Sería bueno encontrar algunas referencias más actuales.

Investigué un poco en Google y solo encontré soluciones. Me temo que el tipo de datos todavía no es compatible.

Editar 02/05/2011

Realmente no entiendo por qué Microsoft no puede solucionar este problema. El siguiente script de PowerShell usa OLE-DB para leer una tabla que contiene una columna CLOB de una base de datos Oracle e insertar los datos en una tabla similar existente en Sql-Server usando bulkCopy, que es una forma muy eficiente.

Ajuste las siguientes cadenas de conexión, consulta y nombre de tabla a su instalación:

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

El siguiente código copia la tabla oracle en una tabla 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
    }
}

Por cierto: el código se basa en el proyecto codeplex del Diccionario de datos realmente simple de Chad Millers

Actualmente, el uso de PowerShell es la única forma en que sé copiar datos con CLOB de Oracle a Sql-Server sin C # ni ninguna herramienta de terceros.

No logré usar ni el Asistente de importación / exportación ni los servidores vinculados.

bernd_k
fuente
grrrr que apesta teniendo en cuenta que ha habido tres lanzamientos de puntos para ORA y al menos un lanzamiento de puntos para MS desde entonces ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand
Realmente no entiendo por qué Microsoft no puede solucionar este problema . Por la misma razón, Microsoft dejó de admitir la biblioteca de cliente Oracle de dotnet framework: "otras personas lo hacen mejor", si parafraseo sin piedad sus respuestas en el pasado. Ningún amor perdido entre esos dos, te digo.
ScottCher