AVMB Soluções em TI

quarta-feira, 8 de outubro de 2014

USO DO TIPO BLOB NAS TABELAS DO SIE/SIM-UFSM

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