13 de abril de 2009

Comando INSERT do SQL em tabela com BLOB

Tem algum maluco aí que já tentou incluir via comando SQL um registro numa tabela que tenha um campo BLOB ? Pois é, eu já… Mas tenho um bom argumento em minha defesa : desenvolvi uma ferramenta para ABC71 que permite manipular e transformar dados, isto é, copiar dados de uma tabela num banco de dados, realizar cálculos e outras transformações nesses dados e lançá-los numa outra tabela, num outro banco de dados. Como isso é feito através de um VBScript, foi necessário passar o comando SQL apropriado, incluindo o dado BLOB. O quê ? Já viu isso em algum lugar ? Está certo ... Foi inspirado no DTS da Microsoft.

Voltando ao assunto, em SQL Server, a sintaxe é como no exemplo abaixo :

insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário', 0x71720002090000434F445F4E554D00494420437573)

onde o campo “objetos“ é do tipo IMAGE, isto é, é um blob.

O texto 0x (zero xis) no início do valor do BLOB é fixo e indica que se trata de um valor hexadecimal. Os demais valores são a representação hexadecimal de cada um dos bytes que compõem a informação que se deseja gravar. Exemplos : um byte com valor 00000000 é representado como 00, o byte 00000001 vai como 01, o byte 11111111 vai como FF, etc.

Como a limitação de tamanho desse campo é ditada pelo espaço em disco e os valores são bytes, pode-se armazenar qualquer informação com esse método : um texto XML, uma estrutura proprietária de sua aplicação, uma imagem, etc..

Essa sintaxe funciona ligeiramente diferente para Oracle e Postgre. Em Oracle, basta remover o 0x do início e colocar os dados entre apóstrofes :

insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário', '71720002090000434F445F4E554D00494420437573')

Em Postgre, é preciso decodificar a informação, chamando a função DECODE. O segundo parâmetro indica que a informação no primeiro parâmetro é um valor hexadecimal :

insert into lare (emp_fil, chave_1, descricao, objetos)
values (10001, 'CONFIG', 'Configuração de Usuário',
DECODE ('71720002090000434F445F4E554D00494420437573',
'hex') )

A função em VBScript listada abaixo aceita como parâmetro um dado binário e produz como resultado a representação hexadecimal desse dado. Esse resultado pode ser usada no INSERT mas é preciso ainda considerar as diferenças de sintaxe citadas antes :
Function BinaryToHex(Binary)
Dim c1, Out, OneByte
For c1 = 1 To LenB(Binary)
OneByte = Hex(AscB(MidB(Binary, c1, 1)))
If Len(OneByte) = 1 Then
OneByte = "0" & OneByte
End If
Out = Out & OneByte
Next
BinaryToHex = Out
End Function

Até a próxima ...

4 comentários :

Angelito Casagrande disse...

SBO BRAZUCA - Fórum SDK SAP Business One
http://www.sbobrazuca.rg3.net

Anônimo disse...

Valeu pela dica! Me ajudou muido...
ps.: Adelar

Ronin disse...

Olá Luiz,

Meus parabéns e NOSSO muito obrigado pelo seu tempo escrevendo. Tenho certeza que muitos estão lendo dicas valiosas.

Gostaria de lhe perguntar o que exatamente faz essa função DECODE a qual você citou que deve ser usada em conjunto com o PostgreSQL. Ela esta disponível no delphi ou é necessário instalar/vincular algum arquivo ?. Se não utiliza-la em que isso afetará caso deseje armazenar um arquivo .doc no campo blob ?

Luís Gustavo Fabbro disse...

Ronin

A função DECODE é nativa do Postgre. Isso significa que, se você vai montar o comando SQL na mão, pode incluí-la no texto sem problemas pois ela não depende da linguagem de programação que está usando.

Mas o Delphi possui mecanismos - como o ADO - que te permitem montar o comando SQL num nível mais alto de forma que você não precise se preocupar com diferenças de sintaxe entre tipos diferente de bancos de dados.

Há no blog um post com mais detalhes sobre isso : Trabalhando com BLOBs em Delphi e C++ Builder.

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.