Banco de Dados

Ξ Deixe um comentário

Redimensionando Imagem via PL/SQL

publicado por Marcelo Dias Oliveira

Redimensionando Imagem via PL/SQLExistem projetos arquitetados de forma trivial sem o olhar de uma Analista de Sistemas experiente, esses podem “viver” por muito tempo. E o que dizer de sistemas que usam diversas tecnologias para um alcançar um objetivo simples e comum?

Para tais casos não há “santa” resiliência que aguente (sobre resiliência falaremos num artigo futuro).

Frente a um cenário como esses, sistemas com complexidade desnecessária, houve certa vez a incumbência de desenvolver um processo para redimensionar imagens usando o próprio Oracle, ou como quiserem PL/SQL. E antes que perguntem: “porque não armazenar o caminho da imagem no disco em uma tabela ao invés de armazenarem a própria imagem?”, respondo: essa foi à pergunta que fiz quando cheguei até o cliente. E como disse, existem projetos arquitetados com “outros olhares”.

Pois bem, qual a solução para redimensionar essas imagens? Como faria?
Pensei em desenvolver uma classe com método(s) em Java para usar na package escrita em PL/SQL. Sem mais delongas segue o que foi desenvolvido.

Primeiro, sugiro desenvolver uma classe em Java para Listar as imagens do seu diretório e assim Redimensiona-las a partir da package. Há vários exemplos na internet para isso, uma pesquisa rápida no Google apresentará diversas soluções. Entretanto, a essência desta primeira classe pode ser consultada no site da Oracle: Listar arquivos com Java pelo Oracle .
Lembre-se, essa classe será usada pelo PL/SQL. Desse modo, certifique-se com o DBA que os pacotes Oracle usados pelo Java estão disponíveis.

Em seguida, vamos à classe para redimensionar as imagens que foram listadas pela classe anterior. Um pequeno detalhe nesse caso, sabendo que estamos chamando a classe em um ambiente diferente do costume, ambiente Oracle, fique atento com o tipo de tratamento que tu darás a saída do buffer.

Redimensionando Imagens

Voilá, como diz meu amigo Antoine Barrault. Aqui está uma maneira de chamar os objetos criados pela classe Java no PL/SQL. Usei o PL/SQL Developer 8. Neste editor temos o local como mostra a imagem.
Escopo IDE

Para que sua classe esteja disponível no ambiente Oracle, no escopo da imagem exibida, você deve recriá-la dentro desse ambiente. Sabendo que suas classes anteriores estão corretas e foram compiladas com sucesso no Eclipse, copie e cole seu código em uma janela SQL Window (caso esteja usando o PL/SQL Developer), ou seja, copia a classe no ambiente onde você normalmente escreve suas Querys.
Mas antes de executar a instrução escreva no inicio da classe Java a seguinte instrução PL/SQL, cada classe deve ter essa instrução:

[codesyntax lang=”java”]

 --Instrução PL/SQL

Create or replace and compile java source named <NOME_REFERENCIANDO_CLASSE_LIST> as

[Seu código Java aqui]
[/codesyntax]

Execute as instruções e atualize o escopo Java sources e Java classes da IDE.
Agora com sua classe Java compilada no ambiente Oracle, chegamos no ponto alto dessa breve e singela explicação, a integração PL/SQL com Java.
Novamente, abra o ambiente que usa para escrever suas Querys PL/SQL e escreva a seguinte instrução PL/SQL, tendo como objetivo, criação da função PL/SQL para classe que lista os arquivos:

[codesyntax lang=”java”]
Create or replace function SuaFunListaPastas(DiretorioMapeado in varchar2) return arrayFile as language java name ‘RetornaLista.ListaArquivos(java.lang.String) return java.oracle.Array’;
[/codesyntax]

Crie uma função PL/SQL para classe que redimensiona os arquivos listados:

[codesyntax lang=”java”]
create or replace function SuaFunRedimensionaFiles(DiretorioMapeado in varchar2) return varchar2 as language java name ‘CropImagem.FormatImage(java.lang.String) return java.lang.String’;

Formas de uso em sua package PL/SQL, por exemplo:

vDiretorioFotos := “\\dir\teste\imagens”;
Fetch vDiretorioFotos bulk Collect into vDirFotos;
For varIndexDir in vDirFotos.first.. vDirFotos.last loop
-- carrega lista com os arquivos
Arquivos := SuaFunListaPastas (vDirFotos(varIndexDir));
-- havendo arquivos nessa lista
if Arquivos.Count > 0 then
-- Chama a função que trata imagens..
Redimensiona := SuaFunRedimensionaFiles (vDirFotos (varIndexDir));
if Redimensiona = 'Success' then
(...)
[/codesyntax]

Um detalhe importante, não esqueça que o schema ou usuário que você está usado para esses testes deve ter permissão nos objetos Java que o Oracle usa. Para isso temos essa instrução que devem ser executas pelo usuário administrador do Banco.
[codesyntax lang=”java”]
call dbms_java.grant_permission(‘Usuario’,’SYS:java.lang.RuntimePermission’,’*’,’writeFileDescriptor’,”);
call dbms_java.grant_permission(‘Usuario’,’SYS:java.lang.RuntimePermission’,’*’,’readFileDescriptor’,”);
call dbms_java.grant_permission(‘Usuario’,’SYS:java.lang.RuntimePermission’,’*’,’deleteFileDescriptor’,”);
call dbms_java.grant_permission(‘Usuario’,’SYS:java.io.FilePermission’,’seuDiretorioMapeado/-‘,’read,write,execute,delete’);
[/codesyntax]

E caso você precise ter certeza que suas classes Java estão validas execute o seguinte select:

[codesyntax lang=”java”]SELECT dbms_java.longname (object_name) FROM user_objects WHERE object_type = ‘JAVA CLASS’ AND status = ‘VALID’;[/codesyntax]

É isso aí, tenha uma boa semana.Até a próxima!

[Crédito da Imagem: PL/SQL – SHutterStock]

Autor

Formado em Sistema de Informação com Ênfase em Análise de sistemas e Processamento de Dados. Pós-graduado em Gestão estratégica de Negócios. Certificação Scrum Master. Conhecedor profundo de metodologias Ágeis como: Lean, Kanban, XP e processos para Startup. Além de possuir amplo conhecimento do PMI. Especialista em desenvolvimento Web e tendo profunda experiência com os principais Bancos de Dados do mercado.

Marcelo Dias Oliveira

Comentários

You must be logged in to post a comment.

Busca

Patrocínio

Publicidade



Siga-nos!

Newsletter: Inscreva-se

Para se inscrever em nossa newsletter preencha o formulário.

Artigos Recentes