CAMPO LONG RAW EM BANCO ORACLE

XICOPONTE 26/04/2012 18:26:41
#400869
Fala Pessoal

To com um probleminha aqui na aquisição de um campo Long Raw de uma base Oracle num sistema Legado em VB6. Quando executo o select abaixo, o recordset retorna vazio, sendo que o select retorna resultados da base. Quando removo o campo Long Raw do select, o sistema retorna as tuplas normalmente. Alguém sabe o que pode ser? Segue o bloco de código.


Dim RsLx As New ADODB.Recordset

sSQL = [Ô] SELECT nvl2(DS_ARQUIVO, [ô]NAO[ô], [ô]SIM[ô]) IS_ARQUIVO_NULL, DS_ARQUIVO, CD_ARQUIVO, NR_DOCTO, CD_EMPRESA FROM TBOD_ARQUIVO A WHERE NR_DOCTO IN ( [Ô]
sSQL = sSQL & [Ô] SELECT UNIQUE(DLPP.NR_DOCTO) [Ô]
sSQL = sSQL & [Ô] FROM TBOD_DADOS_LOTE_PRINT_PME DLPP, TBOD_ARQUIVO A [Ô]
sSQL = sSQL & [Ô] Where DLPP.nr_docto = a.nr_docto [Ô]
sSQL = sSQL & [Ô] AND DS_ARQUIVO IS NOT NULL [Ô]
sSQL = sSQL & [Ô] AND A.CD_RELATORIO = 47 [Ô]
sSQL = sSQL & [Ô] AND DLPP.CD_LOTE_PRINT = [Ô] + nroLote + [Ô]) [Ô]


RsLx.Open sSQL, VGDB_NEG, adOpenDynamic, adLockOptimistic, adCmdText
KERPLUNK 26/04/2012 18:32:17
#400871
Qual o campo que você tira e funciona a consulta?
XICOPONTE 26/04/2012 18:58:40
#400873
O campo DS_ARQUIVO... no banco ele é do tipo long raw e guarda um pdf.
KERPLUNK 26/04/2012 19:22:56
#400875
Campos do tipo LongRaw, não podem ser [Ô]entendidos[Ô] por um recordset do ADO.
AJSO 26/04/2012 23:53:14
#400880
Caro XICOPONTE

O problema é que esse tipos de dados LONG RAW são usados para armazenar binário dados de variável tamanho até 2 GB de comprimento. Somente uma coluna LONG RAW pode ser definida por tabela. Colunas LONG RAW não podem ser usadas em subconsultas, funções, expressões, cláusulas WHERE ou índices. Uma tabela que contém uma coluna LONG RAW não pode ser agrupada. Somente uma coluna LONG RAW pode ser definida por tabela e você não pode ter um LONG e uma coluna LONG RAW definir na mesma tabela.

Seria necessário passar esse seu select para um CURSOR e converter este tipo de dados para ser lido e retirar suas junções para realizar a consulta outra forma seria para ler essa tipo de informação teria que utilizaro o ADO GetChunk - AppendChunk bem antigo mas funcional no VB6 e pode ser utilizado no ADO.

discordo um pouco do colega KERPLUNK quanto ao uso de campos LONG RAW ser utilizada dentro do ADO no VB6, o campo LONG RAW tem muitas restições de uso por causa do tamanho e forma de composição que fica difícil a utilização em selects complexos.

No VB6 tem uma declaração de variável que suporta montar variáveis dessa dimenssão (2GB) que são declarados assim ByteData() As Byte
Outra coisa é que o tipo de cursor do seu ADO não pode ser adOpenDynamic terá que mudar para adOpenKeyset

A dica é se você não precisa de um campo que armazene arquivos de até 2GB por registro altere esse tipo campo no banco para outro tipo de BLOB menor mas funcional no sistema ou terá quer utilizar o ADO GetChunk - AppendChunk para incluir, alterar e excluir esse tipo de dado no seu banco Oracle pelo VB6.

Eu utilizo em um dos meus sistema, funciona muito bem mas é muito restrito para qq outra forma de consulta mais avançada.


Boa sorte
XICOPONTE 27/04/2012 15:27:22
#400917
Senhores

Agradeço imensamente o esforço em me ajudar! Acabei descobrindo o que estava acontecendo...alterei o procedimento segundo orientações do Alessandro, fiz teste em outro banco e funcionou e, então, fui verificar o primeiro banco e descobri que a tabela estava num DBLINK. O oracle não faz transferência de arquivos LARGE (CLOB, BLOB e Long Raw) pelo DBLINK.

Obrigado!
Tópico encerrado , respostas não são mais permitidas