2009-12-22 2 views
12

Я подключаюсь к SQL Server (2005) через Java, используя JDBC-драйвер Microsoft SQL Server 2.0.Получение возвращаемого значения от JDBC MSSQL

Как получить возвращаемое значение из хранимой процедуры? Я делаю что-то вроде:

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

Должен ли я использовать execute()? ExecuteQuery()? executeUpdate()? Ни один из них, похоже, не возвращает возвращаемое значение по умолчанию, но я не совсем уверен, как добраться до него.

EDIT 1: Чтобы быть ясным, я знаю, как вызвать хранимые процедуры. Этот вопрос конкретно касается того, как получить значение RETURN VALUE (в отличие от набора результатов). Возвращаемое значение - это целое число, которое обычно генерируется при выполнении запроса без набора результатов или если вы указываете что-то вроде RETURN 0 в вашем SQL.

EDIT 2: executeUpdate() возвращает int, но этот int не совпадает с возвращаемым значением. Кроме того, параметр OUT не совпадает с возвращаемым значением.

+0

Проверьте следующие ссылки: 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

Я ищу специально, чтобы получить Возвращаемое значение, я не ищу общую информацию о вызове sprocs. –

ответ

33

Bozho был близок, но не совсем там. Однако это привело меня к ответу.

На примере кода я начал с мы в конечном итоге с:

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

ключевыми элементами здесь находится перед «призывом» в функции prepareCall, который устанавливает место для «=?» возвращаемое значение и registerOutputParameter. Он должен быть зарегистрирован как Integer, так как возвращаемое значение всегда является int (по крайней мере, в SQL Server, возможно, оно отличается в других БД). Поэтому вы должны получить его, используя getInt. Я тестировал этот метод, и он работает.

+1

Выше, 'Types.INTEGER'' 'java.sql.Types.INTEGER'. –

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

(или метод соответствующего типа. Вы можете использовать getObject в качестве альтернативы)

От an old getting started tutorial

методы getXXX в CallableStatement извлечения значений из параметров OUT и/или возвращаемого значения хранимую процедуру.

(Кстати, ссылки, которые были предоставлены Umesh имели такого рода информации.) Второй пересмотренный ответ

+0

Это возвращает выходной параметр, который отличается от возвращаемого значения. Я думаю, что хранимая процедура должна иметь выходной параметр, определенный для того, чтобы это работало. –

+0

Нет, это не в контексте CallableStatement (проверьте мой обновленный ответ) – Bozho

+0

Синтаксис вызова вызова неправильный (без синтаксиса JDBC escape), параметр out должен быть зарегистрирован, чтобы быть доступным позже, и ссылка мертва. .. –