Ejemplo con callableStatement

De ChuWiki
Saltar a: navegación, buscar

Viene de preparedStatement()

Procedimientos y funciones de base de datos

En las bases de datos suele ser posible crear procedimientos o funciones que realicen determinadas tareas. Por ejemplo, en Oracle podemos crear una función de esta manera

SQL> CREATE FUNCTION una_funcion (parametro IN NUMBER)
1> RETURN NUMBER
2> IS
   ...
9> RETURN(valor);
10> END

donde los puntos suspensivos representan algunas operaciones que hagamos en base de datos y que dan como resultado un valor numérico, el que sea. Una vez creada esta función en Oracle, podemos llamarla desde java usando una CallableStatement. El código sería similar a este

// Se prepara el Statement
CallableStatement st = conexion.prepareCall( "{?=call una_funcion(?)}");

// Se indica que el primer interrogante es de salida.
st.registerOutParameter(1,Types.NUMERIC);

// Se pasa un parámetro en el segundo interrogante.
st.setInteger(2,parametro);

// Se hace la llamada a la función.
st.execute( );

// Se recoge el resultado del primer interrogante.
resultado = st.getInt( 1 );

En primer lugar hemos llamado a prepareCall(), pasando la llamada a la función con una sintaxis especial y poniendo interrogantes tanto en los parámetros de la función como en su resultado. El siguiente paso ha sido indicar cual es el tipo de salida, llamando a regsiterOutParameter(). En esta función el primer entero (un uno) sirve para indicar cual de los interrogantes es el de salida, el uno es el primero, el 2 el segundo, etc.

Ahora ya nos toca preparar la llamada. Vamos dando valores a los parámetros que pasaremos llamando a los métodos setInteger(), setString(), etc, pasando como primer parámetro un entero que representa el número del interrogante (en este caso el parámetro es el segundo interrogante en la cadena "{?=call una_funcion(?)}". Una vez pasados todos los parámetros, sólo nos queda llamar a exectue() para hacer efectiva la llamada y luego recoger el resultado con getInt(), pasando como parámetro nuevamente el número del interrogante.

Los tipos que puede devolver una función y que podemos pasar a registerOutParameter() son los que están indicados en la clase java.sql.Types.

Si en vez de una función fuera un procedimiento (igual que una función pero que no devuelve valor), entonces la llamada a callableStatement() sería así

CallableStatement st = conexion.prepareCall( "{un_procedimiento(?)}");

es decir, no necesitamos poner el "?=call ...." delante.

Sigue en ResultSet scrollable y updatable