Error ResultSet al acceder a procedimiento almacenado en BBDD
Hola,
es la primera vez que escribo un c贸digo para acceder a procedimientos almacenados en una Base de Datos (oracle) y tengo problema con los par谩metros de salida. El c贸digo compila correctamente, pero cuando intento guardar una variable de salida del procedimiento almacenado en una variable de mi c贸digo java obtengo una excepci贸n.
Mi c贸digo es el siguiente:
final String SQL = "{call miProc(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";
CallableStatement stmt = conn.prepareCall (SQL);
(<definici贸n de varios par谩metros de entrada>)
stmt.registerOutParameter(11, java.sql.Types.INTEGER);
ResultSet resultado= stmt.executeQuery ();
Hasta aqu铆 va fenomenal. Se llama al procedimiento almacenado, el cual termina correctamente y todas las acciones que 茅ste efect煤a sobre la BD son las esperadas.
Sin embargo, necesito recuperar la variable de salida. Lo he probado de dos maneras distintas y en cada caso obtengo una excepci贸n diferente:
int indice = resultado.getInt(1);
Me lanza la excepci贸n SQLException Invalid column index
int indice = resultado.getInt("varINDICE");
varINDICE es el nombre de la variable en el proc. almacenado, aunque he probado tambi茅n con "INDICE", que es el nombre de la columna en la tabla... En ambos casos obtengo la excepci贸n
SQLException ClosedStatement
No tengo ni idea de qu茅 puede estar pasando... :-(
Por si sirve de ayuda, he intentado tambi茅n hacer antes un resultado.next(); para situar el cursor en la posici贸n correcta, pero me sigue dando exactamente los mismos errores.
Por favor, si alguien tiene alguna sugerencia o idea de qu茅 puede estar pasando que me lo comente, ya que necesito hacer que esto funcione urgentemente.
Muchas gracias,
Diana.
es la primera vez que escribo un c贸digo para acceder a procedimientos almacenados en una Base de Datos (oracle) y tengo problema con los par谩metros de salida. El c贸digo compila correctamente, pero cuando intento guardar una variable de salida del procedimiento almacenado en una variable de mi c贸digo java obtengo una excepci贸n.
Mi c贸digo es el siguiente:
final String SQL = "{call miProc(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";
CallableStatement stmt = conn.prepareCall (SQL);
(<definici贸n de varios par谩metros de entrada>)
stmt.registerOutParameter(11, java.sql.Types.INTEGER);
ResultSet resultado= stmt.executeQuery ();
Hasta aqu铆 va fenomenal. Se llama al procedimiento almacenado, el cual termina correctamente y todas las acciones que 茅ste efect煤a sobre la BD son las esperadas.
Sin embargo, necesito recuperar la variable de salida. Lo he probado de dos maneras distintas y en cada caso obtengo una excepci贸n diferente:
int indice = resultado.getInt(1);
Me lanza la excepci贸n SQLException Invalid column index
int indice = resultado.getInt("varINDICE");
varINDICE es el nombre de la variable en el proc. almacenado, aunque he probado tambi茅n con "INDICE", que es el nombre de la columna en la tabla... En ambos casos obtengo la excepci贸n
SQLException ClosedStatement
No tengo ni idea de qu茅 puede estar pasando... :-(
Por si sirve de ayuda, he intentado tambi茅n hacer antes un resultado.next(); para situar el cursor en la posici贸n correcta, pero me sigue dando exactamente los mismos errores.
Por favor, si alguien tiene alguna sugerencia o idea de qu茅 puede estar pasando que me lo comente, ya que necesito hacer que esto funcione urgentemente.
Muchas gracias,
Diana.
Primero, si tu SP no devuelve un resultset no deber铆as hacer un
ResultSet resultado= stmt.executeQuery ();
Simplemente deber铆as hacer
stmt.execute();
Pare recuperar el par谩metro de salida, en tu caso deber铆as hacer
stmt.getInt(11);
Espero te sirva.
ResultSet resultado= stmt.executeQuery ();
Simplemente deber铆as hacer
stmt.execute();
Pare recuperar el par谩metro de salida, en tu caso deber铆as hacer
stmt.getInt(11);
Espero te sirva.
En primer lugar, much铆smas gracias por contestar tan pronto :-D
He probado lo que me indicaste pero sigo teniendo problemas.
Por si acaso hubiera entendido mal lo que quer铆as decir te adjunto el c贸digo despu茅s de los cambios:
final String SQL = "{call insregtest (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";
CallableStatement stmt = conn.prepareCall (SQL);
(...)
int indice=stmt.getInt(11);
boolean resultado= stmt.execute ();
En este caso sigo teniendo la excepci贸n Invalid column index al llamar el m茅todo getInt (con lo cual no llego a ejecutar el procedimiento almacenado).
Si en lugar del n煤mero 11, le especifico el nombre de la variable de salida, es decir,
int stmt.getInt("varINDICE");
tengo un error distinto del que ten铆a antes (ClosedStatement) que es el siguiente:
java.lang.AbstractMethodError: oracle.jdbc.driver.OracleCallableStatement.getInt(java.langString)
Exception in thread "main"
Efectivamente, el driver que estoy utilizando (oracle.jdbc.driver) tiene la clase OracleCallableStatement con el m茅todo getInt, pero puesto que s贸lo tengo el fichero .Class no puedo comprobar si es o no un m茅todo Abstracto (aunque supongo que no, no le veo sentido a un m茅todo abstracto en una implementaci贸n de un interfaz...)
¿Alguien sabe por qu茅 me da ese error?
Muchas gracias,
Diana
He probado lo que me indicaste pero sigo teniendo problemas.
Por si acaso hubiera entendido mal lo que quer铆as decir te adjunto el c贸digo despu茅s de los cambios:
final String SQL = "{call insregtest (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}";
CallableStatement stmt = conn.prepareCall (SQL);
(...)
int indice=stmt.getInt(11);
boolean resultado= stmt.execute ();
En este caso sigo teniendo la excepci贸n Invalid column index al llamar el m茅todo getInt (con lo cual no llego a ejecutar el procedimiento almacenado).
Si en lugar del n煤mero 11, le especifico el nombre de la variable de salida, es decir,
int stmt.getInt("varINDICE");
tengo un error distinto del que ten铆a antes (ClosedStatement) que es el siguiente:
java.lang.AbstractMethodError: oracle.jdbc.driver.OracleCallableStatement.getInt(java.langString)
Exception in thread "main"
Efectivamente, el driver que estoy utilizando (oracle.jdbc.driver) tiene la clase OracleCallableStatement con el m茅todo getInt, pero puesto que s贸lo tengo el fichero .Class no puedo comprobar si es o no un m茅todo Abstracto (aunque supongo que no, no le veo sentido a un m茅todo abstracto en una implementaci贸n de un interfaz...)
¿Alguien sabe por qu茅 me da ese error?
Muchas gracias,
Diana