Java dentro do Oracle

Programando em Java, no Oracle, sem usar Load Java tool

Existem 3 tipos de pessoas. As que sabem o que vou escrever aqui, as que já usaram apenas o Java Load para carregar classes no Oracle e as que acham que isso não existe. Pois bem, se você é a segunda ou a terceira, siga a leitura. Se for a primeira, veja foto de gatos.

A verdade é que faz um bom tempo que trabalhei com classes java dentro do Oracle. Algo em torno de 7 anos ou mais e um projeto em particular, me fez considerar utilizar java para compartilhar a solução na aplicação e no Oracle.

A abordagem utilizando Java Load Tool, basicamente pega um .class ou .jar e carrega dentro do Oracle usando uma ferramenta que existe junto com a instalação do Oracle (o Java Load). Essa solução é bem conhecida e foi exatamente essa que utilizei a alguns anos. E existe uma infinidade de referencias ensinando a trabalhar com essa abordagem, como por exemplo essa, essa outra e essa aqui também. Em resumo, com essa abordagem você escreve sua classe ou seu programa java, compila e utiliza o utilitário java load para carregar seu compilado dentro do Oracle, tornando as operações da sua classe disponíveis para executa-las dentro do Oracle. 


Bacana né? nem tanto! poderia ser melhor... 

Como algo tão simples como compilar uma classe e carregar usando uma ferramenta não é simples?
Primeiro que você tem que executar o Java Load dentro do servidor do Oracle e isso por si só, já é um problema. Imagina em empresas de grande porte? Solicitar ao DBA, aguardar a fila de execução dos chamados para saber se compilou com sucesso. Ou em alguns casos mais rigorosos, você teria de apresentar o código e explicar ao DBA cada linha que está entrando dentro do banco de dados. Afinal, é uma classe compilada que será carregada por um utilitário. Não é apenas abrir uma procedure (por exemplo). 


Então ta, vamos então burlar o DBA ? 

Não, não vamos enganar o DBA, vamos tornar as coisas mais claras e mais simples para nós.
Assim como functions, procedures e outros objetos, podemos compilar um arquivo ".jsp" (não é o que você está pensando). Esse arquivo é exatamente uma classe java, com uma assinatura semelhante a de uma procedure. Assim:

create or replace and compile java source named HojeEhDia as

import java.util.Date;
import java.util.Calendar;

public class HojeEhDia
{
    public static void main(String[] args) {
        System.out.println("hoje é dia: " : hoje("/"));
    }

    public static String hoje(String separador) {
        
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());

        int dia = calendar.get(Calendar.DATE);
        int mes = calendar.get(Calendar.MONTH);
        int ano = calendar.get(Calendar.YEAR);

        return dia+separador+mes+separador+ano;

    }
}

Feito isso, você só precisa chamar sua operação usando uma function do Oracle. Assim:

CREATE OR REPLACE FUNCTION HojeEhDia_Java(separador IN VARCHAR2)
RETURN varchar2 AS

LANGUAGE JAVA NAME 'HojeEhDia.hoje(java.lang.String) return java.lang.String';

E está pronto :) Criamos um objeto do tipo Java Source e uma function para chama-lo. Para testar, basta um select:

select HojeEhDia('/') from dual;

Tudo compilado, facilmente modificável, como um simples objeto Oracle deve ser. 
Só fique atento com os imports. Referencias que não são nativas do java, até funcionam, mas você deverá colocar o .jar delas lá no servidor de banco de dados, na instalação do Oracle.

Me ajudou, espero que te ajude também :) Até a próxima!