Error ResultSet al acceder a procedimiento almacenado en BBDD

Diana
01 de Abril del 2004
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.

maramonar
01 de Abril del 2004
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.

Diana
01 de Abril del 2004
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