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
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!!
Saludos. ¿ La versión de java en la base de datos se puede actualizar? ¿ Como se deberia actualizar si tengo una base de datos oracle10g?
Nunca hemos realizado una actualización de la máquina virtual. Pero si tienes licencia activa de Oracle puedes actualizarte a la última versión del gestor directamente en la página de Oracle.
Hola,
Podria subir a oracle una clase java que invoca a un web service?
Saludos.
Hola por favor no se si me puedas ayudar en este tema, hice un ejemplo con otros datos siguiendo tus pasos y al correr todo no me da problemas pero al final al probar desde el procedimiento no hace nada de lo que esta escrito en la clase java. te envío todo el codigo:
Clase Java:
import java.sql.*;
import java.sql.Timestamp;
import java.util.Date;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import java.util.Calendar;
public class GenerarTransformadores{
public static void ActualizarTransformadoresR(int TraCodigo,int TraNumero,int TraCodigoPuesto,String TraPotencia,Date TraFechaRevision,int TraCoordenadaX,int TraCoordenadaY,String TraObservaciones, String TraUsuCre, String TraUsuMod, Date TraFecCre,Date TraFecMod,int TraNumAnteriorAbonados,int TraNumActualAbonados, int TraNumFaltantesAbonados)
{
try{
String TraFecCre1=””;
String TraFecMod1=””;
String TraFechaRevision1=””;
String TraFecCre2=””;
String TraFecMod2=””;
String TraFechaRevision2=””;
int i=0;
String userOra1=”usu”;
String passwordOra1=”clave”;
String URLOra1 = “jdbc:oracle:thin:@ip:1521:base”;
Connection connOra1 = null;
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
connOra1 = DriverManager.getConnection(URLOra1,userOra1,passwordOra1);
Statement stmtOracle=null;
ResultSet rsOracle=null;
String SQLOracle1 =”select max(objectid) as contar from TransformadoresRevisados”;
stmtOracle=connOra1.createStatement();
rsOracle=stmtOracle.executeQuery(SQLOracle1);
while (rsOracle.next())
{
i=rsOracle.getInt(“contar”);
}
System.out.println(“ultimo registro: “+i);
try
{
TraFechaRevision1=TraFechaRevision.toString();
TraFechaRevision1=TraFechaRevision1.trim();
TraFecCre1=TraFecCre.toString();
TraFecCre1=TraFecCre1.trim();
TraFecMod1=TraFecMod.toString();
TraFecMod1=TraFecMod1.trim();
}
catch(Exception ex)
{
System.out.println(“Error:” + ex.toString());
}
if (TraFechaRevision1.length() < 1)
{TraFechaRevision1="00010101";}
if (TraFecCre1.length() < 1)
{TraFecCre1="00010101";}
if (TraFecMod1.length() < 1)
{TraFecMod1="00010101";}
TraFechaRevision1=TraFechaRevision1.replace("-", "");
TraFecCre1=TraFecCre1.replace("-", "");
TraFecMod1=TraFecMod1.replace("-", "");
i=i+1;
System.out.println(i);
Statement stmtOra=connOra1.createStatement();
Statement actcod=connOra1.createStatement();
String Insertar="";
Insertar=Insertar + "Insert into TransformadoresRevisados";
Insertar=Insertar + " VALUES('"+i+"','"+TraCodigo+"','"+TraNumero+"','"+TraCodigoPuesto+"',"+"to_Date('"+TraFechaRevision1+"','yyyymmdd')"+",'"+TraCoordenadaX+"','"+TraCoordenadaY+"','"+TraObservaciones+"','"+TraUsuCre+"','"+TraUsuMod+"',"+"to_Date('"+TraFecCre1+"','yyyymmdd')"+","+"to_Date('"+TraFecMod1+"','yyyymmdd')"+",'"+TraNumAnteriorAbonados+"','"+TraNumActualAbonados+"','"+TraNumFaltantesAbonados+"',+SDE.ST_GEOMETRY('"+TraCoordenadaX+"','"+TraCoordenadaY+"',0,0,3),'"+TraPotencia+"')";
stmtOra.executeQuery(Insertar);
}
catch(Exception errorDB) {
System.out.println("Error Base de Datos: " + errorDB);
}
}
public static void main (String[] args) {
GenerarTransformadores myConexion = new GenerarTransformadores();
}
}
Procedimiento:
create or replace PROCEDURE ActualizarTransformadores(TraCodigo in NUMBER,TraNumero in NUMBER, TraCodigoPuesto in NUMBER, TraPotencia in VARCHAR2, TraFechaRevision in Date, TraCoordenadaX in NUMBER, TraCoordenadaY in NUMBER, TraObservaciones in VARCHAR2, TraUsuCre in VARCHAR2, TraUsuMod in VARCHAR2, TraFecCre in Date, TraFecMod in Date, TraNumAnteriorAbonados in NUMBER, TraNumActualAbonados in NUMBER, TraNumFaltantesAbonados in NUMBER)
AS LANGUAGE JAVA NAME 'GenerarTransformadores.ActualizarTransformadoresR(int,int,int,java.lang.String,java.sql.Date,int,int,java.lang.String,java.lang.String,java.lang.String,java.sql.Date,java.sql.Date,int,int,int)';
Le pruebo asi:
execute ACTUALIZARTRANSFORMADORES(1005,1,1,'10',null,7393652,9696865,'obs','u1','us2', null, null, 1,1,1);
me da : anonymous block completed
Pero al final no ingresa nada a la base de datos…
Espero me puedan ayudar, mil gracias!