Este artivo visa explanar uma experiência que tive recentemente na qual tive a necessidade de aperfeiçoar rotinas em Oracle PL/SQL com classes JAVA. Aparentemente o que pode parecer complicado não é! É necessário também informar que este artigo baseia-se em capítulo do livro Expert Oracle PL/SQL escrito por Ron Hardman e Michael McLaughlin (McGraw-Hill/Osborne, 2005; ISBN: 0072261943). Válido também é fazer nota ao artigo de autoria por mim desconhecida mas que foi muito importante também http://docstore.mik.ua/orelly/oracle/guide8i/ch09_08.htm

O problema:

Quando inciei um projeto de desenvolvimento de um sistema de informação, um pouco Work Flow, um pouco ERP (guardado as devidas proporções para este último), tive a necessidade de processar documentos no formato XML. Então criei um modelo de documento XML e iniciei o desenvolvimento de uma rotina em Oracle PL/SQL que fizesse, entre outras palavras, a leitura desse xml. Foi um processo de criação de um algoritmo vencedor que lesse o xml em questão. Contudo, após alguns testes bem sucedidos, me debati com um problema enorme de performance da leitura do xml. Isso porque o PLSQL não é uma linguagem otimizada para esses tipos de tarefas.

Bom, procurando algo por aí na internet, mais precisamente no Google.com, achei umas funcionalidades bastante úteis onde é possível integrar a poderosa ferramenta de programação JAVA com Oracle PL/SQL. Basicamente, desde a versão 9i da Oracle é possível usar componentes OO Java, ou seja, classes javas, POJOS, etc diretamente em banco através de PL's.

Os pré-requisitos:

Vamos precisar para concretização desse artigo do seguinte:

  1. Um sistema operacional LINUX (qualquer um);
  2. Um sistema de banco de dados relacional Oracle (10g preferencialmente, pois foi a versão que uso)
  3. Um ambiente de desenvolvimento JAVA (Netbeans ou Eclipse);
  4. JDK 1.4.2*

O uso da JDK 1.4.2 dá-se em função da VM embarcada no Oracle ser a 1.4. Não quero entrar nesse mérito. Não agora...

O desenvolvimento:

Como dito, precisei fazer o parsing de um documento xml. Para isso recorri à API JDOM que manipula muito bem os elementos de documentos xml. Em nosso exemplo simples vou usar um POJO para demonstrar como implementar classes java em stored procedures Oracle.

Eis a classe:


            /*
* GnuLinuxFreak.java
*
* Created on 5 de Fevereiro de 2009, 10:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package jplsql;

/**
*
* @author Daniel Barcellos
*/
public class GnuLinuxFreak {

private static String freak;

/** Creates a new instance of GnuLinuxFreak */
public GnuLinuxFreak() {
}

public static void setFreak(String frk) {
freak = frk;
}

public static String getFreak() {
return freak;
}
}
        

Tanto os atributos quanto os metodos tem de utilizar o modificador static porque será necessário envocá-los diretamente sem a necessidade de instanciar objetos da classe.

Exemplo:


            GnuLinuxFreak.getFreak();
        

Agora, vamos aos objetos de banco.

Eis a procedure. Note a utilização do operador AS LANGUAGE JAVA o qual informa ao compilador de que se trata de uma implementação com JAVA.


            CREATE OR REPLACE PROCEDURE PRC_GNU_LINUX_FREAK( P_FREAK VARCHAR )
            AS LANGUAGE JAVA
            NAME 'GnuLinuxFreak.setFreak(java.lang.String)';
        

A function:


            CREATE OR REPLACE FUNCTION FNC_GNU_LINUX_FREAK RETURN VARCHAR2
            AS LANGUAGE JAVA
            NAME 'GnuLinuxFreak.getFreak(java.lang.String) return java.lang.String';
        

A diferença, entre outras, é o fato que, na implementação da chamada à classe tanto no argumento (parâmetro), quanto no retorno deve-se utilizar o full qualified name da classe correspondente.

Agora, vamos fazer o load da classe em nossa base. Para tanto, utilizaremos o utilitario loadjava. Este é um utilitário de linha de comando, o que obriga decorar uma quase que infinidade de comandos adicionais. É possível também fazê-lo utilizando a chamada DBMS_JAVA.LOADJAVA


            call dbms_java.loadjava(' -schema "" C:\Temp\JPlsql.jar')
        

Em nosso exemplo utilizaremos o utilitario de linha de comando. A sintaxe usada segue abaixo:


            loadjava -v -user USER/SENHA -resolve c:\Temp\JPlsql.jar
        
  • Uma listagem explanatória sobre os demais parâmetros pode ser encontrada em http://docstore.mik.ua/orelly/oracle/guide8i/ch09_04.htm
  • O argumento -v significa verbose mode, ou seja, mostrará na tela tudo que for de informações do processo de carga.
  • O - user indicará para o utilitario para qual esquema utilizar na carga.
  • O - resolve é o cerne do comando propriamente dito. Ele resolverá as dependecias.

Se tudo der certo durante o processo todo de carga de nossa classe de exemplo. Podemos passar para os testes. Se você tiver alguma dúvida em algo que deu errado, não deixe de postar comentários, críticas, etc.

Os testes:

Para testar, primeiro vamos fazer a chamada à procedure PRC_GNU_LINUX_FREAK.


            EXEC PRC_GNU_LINUX_FREAK('Im Crazy For LINUX!!!');
        

Em seguida podemos ver se o método getFreak conseguirá buscar a string informada pela procedure acima.


            SET SERVEROUTPUT ON
            EXEC DBMS_OUTPUT.PUT_LINE(FNC_GNU_LINUX_FREAK);
        

Conclusão

Bom, imagine a quantidade de possibilidades que podemos com essas duas ferramentas. Eu sei que muitos fundamentalistas do mundo java dirão porque extender plsql de oracle se hoje em dias podemos contar com as mais diversas API'S e Frameworks disponíveis de acesso a banco de dados e persitência. Eu concordo em partes. Porém quando se trata de sistemas legados onde todas a estrutura foi e está sendo desenvolvida em PLSQL as possibilidade desse casamento podem ser infinitas até o limite de ambas as linguagens.