Existem 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.
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.
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]
You must be logged in to post a comment.