Utilizar una clase Java en Oracle 10g

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

Analista/Desarrollador y cofundador de QBit Mexhico. Tecnologías utilizadas Android, Java (EJB, Servlets, Faces, Groovy & Grails, Maven, Swing), .Net (C#, VB, ASP, MVC), Delphi, Spring, Hibernate, DTSx, Oracle, T-SQL, Firebird, MySQL, MongoDB, NodeJs, ReactJs (Flux). Sistemas Operativos Mac, Ubuntu y Windows.

Twitter LinkedIn 

20 thoughts on “Utilizar una clase Java en Oracle 10g

    1. 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.

  1. 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

    1. 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.

  2. 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.

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

  4. 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

    1. 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.

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

  6. 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?

    1. 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.

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

Responder a mike Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *