CAMPO LONG RAW EM BANCO ORACLE
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
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
Qual o campo que você tira e funciona a consulta?
O campo DS_ARQUIVO... no banco ele é do tipo long raw e guarda um pdf.
Campos do tipo LongRaw, não podem ser [Ô]entendidos[Ô] por um recordset do ADO.
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
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
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!
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