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.
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).
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!
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!