Esclarecimento técnico para analistas de TI das instituições
Temos vários atributos das
tabelas componentes do SIE/SIM-UFSM do tipo BLOB. O seu uso é necessário para
armazenar, por exemplo, arquivos de imagens como a FOTO de Alunos e Funcionários.
Temos recebidos algumas demandas de dúvidas na manipulação SQL de colunas do
tipo Blob.
Dois exemplos de dúvidas recebidas:
com relação ao uso do UNION neste tipo de coluna e, com relação a extrair a
informação (imagem) armazenada em uma coluna Blob para um relatório. Desta
forma, compartilhamos os esclarecimentos abaixo:
Na manipulação ou consulta do
dado do tipo Blob através de SQL, este não permite o uso de várias funções e
comandos normais que usamos em strings, inclusive o uso do UNION sem ALL.
O campo Blob não é uma string (como
o varchar) e a cláusula UNION compara o que retornou nas duas consultas e caso
tenha linhas iguais retornadas, trará somente uma. Não é possível comparar o
tipo Blob, logo o UNION não pode ser utilizado.
Neste
artigo é possível encontrar algumas explicações sobre esse tipo.
...
Não é possível ordenar por uma coluna BLOB (nem usar GROUP
BY, DISTINCT, UNION, JOIN ON)
Não é possível concatenar colunas blob.
...
Então, ao utilizar o UNION, mesmo que o tamanho das colunas
tipo Blob sejam iguais nas duas tabelas, ocorrerá erro.
SELECT FOTO
FROM ALUNOS
WHERE FOTO IS NOT NULL
UNION
SELECT FOTO
FROM FUNCIONARIOS
WHERE FOTO IS NOT NULL
>[Error] Script lines: 1-7
--------------------------
DB2 SQL
error: SQLCODE: -134, SQLSTATE: 42907, SQLERRMC: FOTO
Message:
Improper use of a string column, host variable, constant, or function
"FOTO".
Agora, utilizando o UNION ALL a consulta não dará erros.
SELECT FOTO
FROM ALUNOS
WHERE FOTO IS NOT NULL
UNION ALL
SELECT FOTO
FROM FUNCIONARIOS
WHERE FOTO IS NOT NULL
Nas tabelas componentes do
SIE/SIM-UFSM, a coluna Blob (exemplo:
coluna FOTO), o limite máximo de bytes se resume ao tamanho da coluna de
cada tabela, que atualmente pode ser 10Mb ou 20 Mb em bancos DB2 e ilimitado
para bancos ORACLE. Em alguns clientes essas colunas (FOTO - tipo Blob) podem
ter sido criadas com tamanhos menores e não padronizadas, já que antigamente
não se trabalhava com formato PNG.
Em bancos DB2, é possível
alterar, o tamanho da coluna BLOB do campo FOTO (por exemplo) para 20 MB,
através do comando abaixo:
ALTER TABLE ALUNOS
ALTER COLUMN FOTO SET DATA TYPE BLOB(20971520);
Após você deve dar um Reorg table na tabela. Reorg table
dbsm.ALUNOS;
OBS: O comando ALTER COLUMN acima
não é aceito em versões mais antigas de DB2. Dúvidas, consulte site da IBM.
Tratando-se ainda do exemplo da
coluna FOTO, recentemente, realizamos uma melhoria no ajuste do tamanho da foto
ao inseri-la no cadastro. Ao inserir a foto, é realizado um redimensionamento
visual, ou seja, independentemente do tamanho da foto ela se ajusta ao campo,
embora no banco o arquivo fique no formato original. Ressaltamos também que o
modelo de imagem de entrada deve ser 3x4, ou seja, 110x170 (LXA), para imagens
mais largas ou mais altas, irá ocorrer distorção.
Como exibir BLOB'S em relatórios compilados Delphi.
Como muitas instituições
desenvolvem seus próprios relatórios seguem as diretrizes:
Relatórios compilados podem
retornar as colunas BLOB e exibi-las normalmente, no entanto, é necessário
conhecer o formato da imagem salva antes de realizar essa operação. Por
exemplo, criando um relatório e utilizando o componente TQRDBImage será
possível trazer todas as fotos dos alunos salvas em banco e exibi-las no
relatório. No entanto, se a foto tiver sido salva com diferentes formatos
(jpeg, bmp, png, gif, etc), o relatório irá gerar uma exceção de conversão e
não irá executar.
Esse tipo de problema pode ser
tratado criando um mecanismo de conversão da imagem antes da renderização de
cada banda do relatório, fazendo a leitura do cabeçalho da imagem contido no
BLOB e realizando a conversão conforme o tipo detectado. Atualmente não existe
um componente disponível na arquitetura SIM/SIE-UFSM que faça isso, cada caso
deve ser analisado separadamente. Com um componente específico isso seria
abstraído do desenvolvedor que poderia ligar qualquer tipo de BLOB (desde que
armazene conteúdo de imagens) e exibi-los normalmente nos relatórios.
Nenhum comentário:
Postar um comentário