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.
Una consulta no le pasas los datos de los parametros de entrada? Solo le pasa el tipo de dato
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!
hola . muchs gracias por subir esto me ayudó mucho . saludos