Por que não consigo ler as colunas do Oracles CLOB por meio do servidor vinculado ao SQL-SERVER 2008?


10

Desejo acessar dados em um banco de dados Oracle 11g do SQL-Server 2008

Eu configuro um servidor vinculado e quando executo

select * from [Link_server_name]..Oracle_schema.Oracle_table

e Oracle_table contém as colunas Number e varchar2, todas funcionam como exceto.

Mas quando o Oracle_table contém uma coluna CLOB, recebo o seguinte erro:

O controlador de banco de dados OLE 'MSDAORA' para o servidor de verificação 'L_V407SR8T' e o código de erro 'Erro não especificado' foram excluídos.

O erro de Oracle OLE DB-Anbieter 'MSDAORA' para o servidor de verificação 'L_V407SR8T' hat die Meldung 'ocorreu, mas a mensagem de erro não pôde ser recuperada do Oracle.' zurückgeben.

O controlador de banco de dados OLE 'MSDAORA' para o servidor de verificação 'L_V407SR8T' ou o tipo de dados 'Tipo de dados não é suportado.' zurückgeben.

Msg 7306, nível 16, estado 2, linha 1

Die '"MCCAPP". "DOGGRUPPEN"' - Tabela de Anbiet OLE DB 'MSDAORA' para o servidor de verificação 'L_V407SR8T' kann nicht geöffnet.

Usando OPENQUERY

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

eu recebo

O erro de Oracle OLE DB-Anbieter 'MSDAORA' para o servidor de verificação 'L_V407SR8T' hat die Meldung 'ocorreu, mas a mensagem de erro não pôde ser recuperada do Oracle.' zurückgeben. O controlador de banco de dados OLE 'MSDAORA' para o servidor de verificação 'L_V407SR8T' ou o tipo de dados 'Tipo de dados não é suportado.' zurückgeben.

Desculpe as mensagens de erro em alemão.

Minha pergunta: Existe alguma maneira de ler colunas CLOB por meio de servidores vinculados?

EDITAR:

  • O Assistente para Importação e Exportação do SQL Server parece depender também do OLE DB e é péssimo nas mesmas tabelas
  • Estou me perguntando, se o problema depende do uso dos conjuntos de caracteres, mas não posso alterá-los
  • Como solução prática, eu uso alguns scripts do PowerShell para obter os dados, mas

Você deve ser capaz de ler o CLOB se você pelo menos pode convertê-lo em primeiro lugar ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Respostas:


3

Baixe e instale um cliente de banco de dados Oracle 11 em sua máquina SQL Server 2008.

Configure um servidor vinculado usando um provedor Oracle OLE DB (OraOLEDB.Oracle).

Verifique se "Allow InProcess" está ativado nas opções do provedor.

O cliente Oracle 11 OLE DB suporta CLOBs.


2

Um comentário a uma resposta SO question Como ler uma coluna CLOB no Oracle usando o OleDb?

contém um link para a antiga postagem de suporte da Microsoft com a seguinte declaração

Os tipos de dados específicos do Oracle 8.x, como CLOB, BLOB, BFILE, NCHAR, NCLOB e NVARCHAR2, não são suportados.

Seria bom encontrar algumas referências mais atuais.

Eu fiz algumas pesquisas no Google e encontrei apenas soluções alternativas. Receio que o tipo de dados ainda não seja suportado.

Editar 02/05/2011

Realmente não entendo por que a Microsoft não consegue corrigir esse problema. O script do PowerShell a seguir usa o OLE-DB para ler uma tabela que contém uma coluna CLOB de um banco de dados Oracle e inserir os dados em uma tabela semelhante existente no Sql-Server usando bulkCopy, que é uma maneira muito eficiente.

Ajuste as seguintes cadeias de conexão, consulta e nome da tabela para sua instalação:

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

O código a seguir copia a tabela oracle em uma tabela 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: o código é baseado no projeto codeplex do Chade Millers

Atualmente, usar o PowerShell é a única maneira que conheço de copiar dados com CLOBs do Oracle para o Sql-Server sem usar C # ou qualquer ferramenta de terceiros.

Não tive êxito usando o Assistente de Importação / Exportação nem os servidores vinculados.


grrrr que é péssimo, considerando que foram lançamentos de três pontos para a ORA e de pelo menos um ponto para MS desde então ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

Realmente não entendo por que a Microsoft não consegue corrigir esse problema ? Pelo mesmo motivo, a Microsoft parou de oferecer suporte à biblioteca cliente Oracle da estrutura dotnet - "outras pessoas melhoram", se eu parafrasear implacavelmente suas respostas no passado. Nenhum amor perdido entre os dois, eu lhe digo.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.