2009-12-22 10 views
12

Me estoy conectando a SQL Server (2005) a través de Java utilizando el controlador JDBC 2.0 de Microsoft SQL Server.Obtener el valor de retorno de JDBC MSSQL

¿Cómo obtengo el valor de retorno de un procedimiento almacenado? Estoy haciendo algo como:

Connection connection = dataSource.getConnection() 
CallableStatement proc = connection.prepareCall("{ call dbo.mySproc() }"); 
proc.execute(); 

¿Debo estar utilizando execute()? ejecutar la solicitud()? executeUpdate()? Ninguno de estos parece devolver un valor de retorno por defecto, pero no estoy seguro de cómo llegar a él.

EDIT 1: Para ser claros, sé cómo llamar a los procedimientos almacenados. Esta pregunta es específicamente sobre cómo obtener el VALOR DEVUELTO (a diferencia de un Conjunto de resultados). El valor de retorno es un número entero que generalmente se genera al ejecutar una consulta sin conjunto de resultados o si especifica algo como RETURN 0 en su SQL.

EDIT 2: executeUpdate() devuelve un int pero este int no es lo mismo que el valor devuelto. Además, un parámetro OUT no es lo mismo que un valor de retorno.

+0

Revise los siguientes enlaces [http://www.exampledepot.com/egs/java.sql/CallProcedure.html](http://www.exampledepot.com/egs/java.sql/CallProcedure.html) [ http://www.jguru.com/faq/view.jsp?EID=30731](http://www.jguru.com/faq/view.jsp?EID=30731) – Umesh

+0

Estoy buscando específicamente obtener el Valor de retorno, no estoy buscando información genérica sobre llamadas a sprocs. –

Respuesta

33

de Bozho estaba cerca pero no está allí. Sin embargo, me llevó a la respuesta.

Tomando el ejemplo de código Empecé con que terminan con:

CallableStatement proc = connection.prepareCall("{ ? = call dbo.mySproc() }"); 
proc.registerOutParameter(1, Types.INTEGER); 
proc.execute(); 
int returnValue = proc.getInt(1); 

Las piezas clave aquí son el frente de la "llamada" en la función prepareCall que establece un lugar para "=?" el valor de retorno y el registerOutputParameter. Tiene que estar registrado como un Entero, ya que el valor de retorno siempre es un int (al menos en SQL Server, tal vez sea diferente en otros DB). Por lo tanto, debe obtenerlo usando getInt. Probé este método y funciona.

+1

Arriba, el 'Types.INTEGER' es' java.sql.Types.INTEGER'. –

1
c.prepareCall("? = .."); 
cs.execute(); 
String returnedValue = cs.getString(1); 

(o el método del tipo apropiado. Puede utilizar getObject alternativamente)

De an old getting started tutorial

los métodos getXXX en CallableStatement recuperar los valores de los parámetros OUT y/o valor de retorno de un procedimiento almacenado.

(Por cierto, los enlaces que fueron proporcionados por Umesh tenían este tipo de información.) Segunda respuesta revisada

+0

Eso devuelve un parámetro de salida, que es diferente de un valor de retorno. Creo que el procedimiento almacenado debería tener un parámetro de salida definido para que esto funcione. –

+0

no, no está en el contexto de CallableStatement (verifique mi respuesta actualizada) – Bozho

+0

La sintaxis de la llamada de preparación es incorrecta (sin sintaxis de escape JDBC), el parámetro de salida debe registrarse para estar disponible más tarde y el enlace está muerto. .. –

Cuestiones relacionadas