Existen dos formas de subir una clase Java a un esquema. La primer forma solo implica subir el archivo .Class y la segunda sube el archivo .Java
Clase Ejemplo
public class MiClaseOracle{
public static String mensaje() {
return “Mexico lindo y querido”;
}
public static void invierteNumeros(int[] primerNumero, int[] segundoNumero) {
int temporal = primerNumero[0];
primerNumero[0] = segundoNumero[0];
segundoNumero[0] = temporal;
}
}
Subir .Class
Primero se debe de revisar la versión del jdk con la que se compila y la versión del jdk que tiene la base de datos. El comando para revisar la versión es java -version. En caso de que se desee olvidar de esta ambigüedad se debe compilar utilizando el comando localizado en el directorio [ORAHOME]/db_1/jdk/bin/.
Una vez generado el archivo .Class se debe de ejecutar el siguiente comando en la linea de comandos: loadjava -user [usuario]/[contraseña]@[baseDatos] [NombreClase].class
Ejemplo
loadjava –user miusuario/mipwd@mibase MiClaseOracle.class
Subir .Java
Obviamente en este caso se requiere tener el archivo .Java y ejecutar el siguiente comando en la línea de comandos: loadjava -user [usuario]/[contraseña]@[baseDatos] -resolve [NombreClase].java
Ejemplo
loadjava –user miusuario/mipwd@mibase -resolve MiClaseOracle.java
Después de haber ejecutado la anterior línea (ojo, no debe de mandar algún aviso la línea de comando) se debe de acceder a la base de datos (utilizando el mismo usuario con la que se ejecuto el comando anterior) y ejecutar el comando alter java class “[NombreClase]“ compile;
Ejemplo
alter java class ” MiClaseOracle” compile;
Ejecución
Para poder consumir las funciones implementas en la clase MiClaseOracle se deben de crear en la base de datos una función y un procedimiento almacenado.
Función Mensaje
CREATE FUNCTION mensaje RETURN VARCHAR2
AS LANGUAGE JAVA
NAME ‘MiClaseOracle.mensaje() return java.lang.String’;
Procedimiento InvierteNumeros
CREATE PROCEDURE invierteNumeros
( primerNumero IN OUT NUMBER
, segundoNumero IN OUT NUMBER
) AS LANGUAGE JAVA
NAME ‘MiClaseOracle.invierteNumeros(int[], int[])’;
Consumo
Para verificar la funcionalidad de lo que hemos venido haciendo es necesario escribir y ejecutar el siguiente PL
DECLARE
mensajerecibido VARCHAR2(200);
primerNumero NUMBER;
segundoNumero NUMBER;
BEGIN
primerNumero := 1;
segundoNumero := 9;
invierteNumeros(primerNumero,segundoNumero);
mensajerecibido := mensaje();
DBMS_OUTPUT.PUT_LINE(‘Primer = ‘ || primerNumero || ‘ — Segundo = ‘ || segundoNumero );
DBMS_OUTPUT.PUT_LINE(‘Mensaje = ‘ || mensajerecibido);
END;
Twiter @QBit_Mike
Compartir y Disfrutar
Entradas relacionadas:
- Remover elementos repetidos de un array php ruby java c# vb javascript
- rsync sobre ssh sin utilizar claves
- Mis estimados rudos. Un poco de Java, Hibernate y T-SQL
Tags: Java, oracle, programacion


Muy buen post, muy sencillo y muy practico.
Hola, y las librerias, si ocupo una herramienta como Axis en mis clases de Java, en donde se deben guardar las librerias??
Buenas noches Tony,
Lo que puedes hacer es crear un Jar. El problema de hacer un archivo jar es que al realizarlo con herramientas externas de Oracle (como Netbeans) tienes que tener cuidado con la versión de Java que utiliza el NetBeans y Oracle; ya que al momento de ejecutarlo en la linea de comandos de Oracle te puede marcar problemas de ejecución.
muy bueno lo que buscaba
saludos,
hola
cuando ejecuto en base de datos
SELECT *
FROM user_objects U
WHERE object_type=’JAVA CLASS’;
me sale el objeto que acabo de subir pero con un nombre muy raro
com/prueba/jaxws/Hola
y cuando trato de consumirlo asi:
NAME ‘Hola.saludo() return java.lang.String’;
me dice ORA-29540: CLASS HOLA DOES NOT EXIST
ESTA ES LA CLASE
package com.prueba.jaxws;
public class Hola {
public static String saludo() {
return “Hola:”;
}
}
Que me falta? estoy desesperado
Tratar de encontrar el error con la información que me estas proporcionando es muy complicado. Intenta primero quitando el nombre del paquete al momento de compilar la clase y vuelve a realizar todo el procedimiento nuevamente. Avísanos tus resultados.
Mil gracias
ya me funcionó.
El error estaba en las versiones de java que tenia mi IDE eclipse que era de donde estaba haciendo las compilaciones vs la version de java que tiene mi oracle. Lo que hice fue compilar con el jre que tiene mi oracle. Gracias por tu interés.
Excelente. ¿nos podrías describir brevemente para que lo utilizaste? Saludos.
Hola, tengo 10g, hice lo que indicas al principo pero aun asi me dice : clase especificada incorrectamente : java.lang.NUllPointerException en cada clase que compone mi programa. el comando que uso es : load -user miusu/passw@basedatos nombre_del_jar.
De antemano Gracias!
¿estas utilizando el jdk o jre de Oracle o de Java?
Gracias por tu respuesta.
jdk de oracle de hecho estoy compilando las clases en este directorio : C:\oracle\product\10.2.0\db_1\jdk\bin. Oracle tiene java 1.4 yo instalè 1.6. no se tiene que ver.
Gracias
Lo que me estoy percatando es que estas tratando de subir un archivo jar lo cual no creo que se pueda ya que Oracle lo que te va a reconocer son clases y no paquetes.
ok, me da el mismo mensaje cuando intento con la clase, en mi caso, BarCodeMaker.class. El objetivo es incorporar a la base de datos 4 clases relacionadas donde la principal es la que te menciono. Ahora una pregunta, es cierto que todos los metodos deben ser estaticos para que funcione, (lo lei por alli)? porque mis 4 clases son un programa que genera codigo de barras y tiene diversos metodos y variables.
Tengo esta necesidad porque no podemos ejecutar el comando host desde oracle report 6i para llamar a este programa, asi que decidimos incorporalo a la base datos.
si tienes otra opcion con gusto la escucho…gracias!
La clase no necesariamente debe de ser estática pero si los métodos. Si gustas enviar tu código para que lo revisemos y compilemos y poder ayudarte a tu problema a info@qbit.com.mx ya que así me es demasiado complicado darte una solución.
El primer paso seria colocar esas clases en la base de datos con el loadjava, luego revisariamos los metodos, estaba pensando si al indicar el comando loadjava estoy usando un usuario que no tiene privilegios para este tipo de operaciones…eso tendra que ver?
Saludos, mike te enviè un correo a la direcciòn que indicaste, alli te explico…gracias!!