Realizar una llamada a una función PL/SQL en Java

Por comodidad, por eficiencia o por aprovechar una función ya implementada, puede ser interesante lanzar una llamada a una función PL/SQL desde Java, en lugar de hacer los cambios directamente en el código Java. Esta llamada se puede hacer pasando los parámetros de entrada necesarios para la ejecución de la función, de la misma manera que se puede recoger los valores que devuelva.

De manera parecida a cómo se puede ejecutar sentencias SQL desde el código Java, se puede hacer llamadas a funciones de la base de datos Oracle. Para ello, se necesita dos objetos, uno para la conexión -Connection (objeto que usado para conectar con la base de datos)- y otro para el tratamiento de la llamada a una función PL/SQL desde Java y su ejecución -CallableStatement-.

    //Los objetos pertenecen al paquete java.sql.*
    import java.sql.CallableStatement;
    import java.sql.Connection;
     
    //Inicialización 
    Connection connection = //nuestro objeto de conexión a bbdd
    CallableStatement cs = null;

A continuación se inicializa el objeto CallableStatement, usando el objeto de la conexión a base de datos con el nombre del paquete y de la función, separados por un punto y se cargan los parámetros, si es que los tuviera.

El método de llamada que utiliza la clase Connection es prepareCall, el cual sirve tanto para llamar a procedimientos como a funciones. A continuación hay que dar valor a los parámetros (con los métodos setString(), setInt(), etc. de la clase CallableStatement) que necesite la función, junto con el tipo del parámetro.

También hay que registrar los parámetros de salida con el método registerOutParameter, indicando la posición del parámetro (número de concurrencia del caracter ‘?’) con la que se corresponde. Finalmente, se ejecuta la llamada con el método execute() de CallableStatement y se recoge el valor de retorno (getString(), getInt(), etc.) pasándole la posición que le corresponde, que debe coincidir con la posición declarada anteriormente con el método registerOutParameter().

Ejemplo de llamada a una función PL/SQL en Java

En el siguiente ejemplo de función en Java, se realiza la llamada a una función sin parámetros y cuyo retorno es un String.

    //Se realiza la llamada a la funcion de BBDD que retornará un String
    cs = connection.prepareCall("{? = call NOMBRE_PAQUETE.NOMBRE_FUNCION ()}");
    cs.registerOutParameter(1, Types.VARCHAR); //se indica el objeto de salida y la posición, en este caso un String.
    cs.execute(); //ejecuta la llamada y retorna un boolean, se puede usar también executeUpdate() que retorna un entero.

    //se recupera el resultado de la funcion pl/sql
    String retorno = cs.getString(1);

Si la función admitiera parámetros, habría que indicarlos con una interrogación (?) dentro de la llamada y a continuación añadirlos al objeto CallableStatement.

    //Se realiza la llamada a la funcion de BBDD que retornará un String
    cs = connection.prepareCall("{? = call NOMBRE_PAQUETE.NOMBRE_FUNCION (?,?)}");
     
    cs.registerOutParameter(1, Types.VARCHAR); 
    cs.setString(2, "valor1");
    cs.setInt(3, 12345);
    cs.execute(); 
    //se recupera el resultado de la funcion pl/sql
    String retorno = cs.getString(1);

Este objeto tiene multitud de posibilidades para insertar parámetros de diversos tipos, así como para recogerlos y tratarlos desde funciones en Java.

3 comentarios en «Realizar una llamada a una función PL/SQL en Java»

    • Hola Luciano,
      Tienes razón, era un error… Se le pasa el tipo de dato a la declaración de los parámetros de salida, pero a los de entrada -obviamente- hay que pasarles el valor de los mismos.
      Cosas del Copy&Paste 🙂
      Muchas gracias por comentarlo!
      Saludos!

      Responder

Deja un comentario

Pin It on Pinterest