Pourquoi ne puis-je pas lire les colonnes Oracles CLOB via le serveur lié SQL-SERVER 2008?


10

Je souhaite accéder aux données d'une base de données Oracle 11g à partir de SQL-Server 2008

J'installe un serveur lié et quand j'exécute

select * from [Link_server_name]..Oracle_schema.Oracle_table

et Oracle_table contient les colonnes Number et varchar2, tous fonctionnent comme excepté.

Mais lorsque Oracle_table contient une colonne CLOB, j'obtiens l'erreur suivante:

Der OLE DB-Anbieter «MSDAORA» für den Verbindungsserver «L_V407SR8T» hat die Meldung «Unspecified error» zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Une erreur Oracle s'est produite, mais le message d'erreur n'a pas pu être récupéré d'Oracle.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Le type de données n'est pas pris en charge.' zurückgeben.

Msg 7306, niveau 16, état 2, ligne 1

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

Utiliser OPENQUERY

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

Je reçois

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Une erreur Oracle s'est produite, mais le message d'erreur n'a pas pu être récupéré d'Oracle.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Le type de données n'est pas pris en charge.' zurückgeben.

Veuillez excuser les messages d'erreur allemands.

Ma question: existe-t-il un moyen de lire les colonnes CLOB via des serveurs liés?

ÉDITER:

  • L'Assistant Importation et Exportation SQL Server semble également dépendre d'OLE DB et aspire les mêmes tables
  • Je me demande si le problème dépend des utilisations des jeux de caractères, mais je ne peux pas les changer
  • Comme travail pratique, j'utilise certains scripts PowerShell pour obtenir les données, mais

Vous devriez pouvoir lire le CLOB si vous pouvez au moins le convertir en premier ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Réponses:


3

Téléchargez et installez un client de base de données Oracle 11 sur votre machine SQL Server 2008.

Configurez un serveur lié à l'aide d'un fournisseur Oracle OLE DB (OraOLEDB.Oracle).

Assurez-vous que «Autoriser InProcess» est activé dans les options du fournisseur.

Le client Oracle 11 OLE DB prend en charge les CLOB.


2

Un commentaire à une réponse SO question Comment lire une colonne CLOB dans Oracle en utilisant OleDb?

contient un lien vers l'ancien article du support Microsoft avec la déclaration suivante

Les types de données spécifiques à Oracle 8.x, tels que CLOB, BLOB, BFILE, NCHAR, NCLOB et NVARCHAR2, ne sont pas pris en charge.

Ce serait bien de trouver des références plus actuelles.

J'ai fait quelques recherches sur Google et n'ai trouvé que des solutions de contournement. Je crains que le type de données ne soit toujours pas pris en charge.

Modifier le 02/05/2011

Je ne comprends vraiment pas pourquoi Microsoft n'est pas en mesure de résoudre ce problème. Le script PowerShell suivant utilise OLE-DB pour lire une table contenant une colonne CLOB à partir d'une base de données Oracle et insérer les données dans une table similaire existante sur Sql-Server à l'aide de bulkCopy qui est un moyen très efficace.

Ajustez les chaînes de connexion, la requête et le nom de table suivants à votre installation:

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

Le code suivant copie la table Oracle dans une table 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
    }
}

BTW: le code est basé sur le projet codeplex Chad Millers Really Simple Data Dictionary

Actuellement, l'utilisation de PowerShell est le seul moyen que je connaisse pour copier des données avec des CLOB d'Oracle vers Sql-Server sans utiliser C # ou tout autre outil tiers.

Je n'ai pas réussi à utiliser ni l'assistant d'importation / exportation ni les serveurs liés.


grrrr qui craint étant donné qu'il y a eu trois versions pour ORA et au moins une version pour MS depuis lors ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

Je ne comprends vraiment pas pourquoi Microsoft n'est pas en mesure de résoudre ce problème ? Pour la même raison, Microsoft a cessé de prendre en charge la bibliothèque cliente du framework dotnet Oracle - «d'autres personnes le font mieux», si je paraphrase impitoyablement leurs réponses dans le passé. Aucun amour perdu entre ces deux, je vous le dis.
ScottCher
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.