2015-10-14 4 views
2

У меня есть хранимая процедура «тест», который выглядит как:хранимые процедуры с возвратом значение

CREATE PROCEDURE test 
@name varchar(32) 
AS 
DECLARE 
     @login_status TINYINT, 
    @syb_login varchar(20), 
     @syb_pass varchar(20) 
... 
..  


BEGIN 
      SELECT @status = 0 
      SELECT @login as login, 
        @pass as pass, 
        @status as status 
      RETURN 0 
     END 

Мне нужно передать один входной параметр «Myname» в качестве входного параметра для этой процедуры, и которые, в свою очередь, возвращает вход, пропуск и статус в качестве выходных (только из одной записи) параметров.

В JDBC, я пытался сделать, как показано ниже:

String query = "{call test(?,?,?)}"; 
    System.out.println(query); 
    CallableStatement proc = null; 
    ResultSet rs; 
    try { 
     proc = connection.prepareCall(query); 
     proc.setString(1, "myName"); 

    proc.registerOutParameter(2, java.sql.Types.VARCHAR); 
    proc.registerOutParameter(3, java.sql.Types.VARCHAR); 

    proc.execute(); 

    System.out.println(proc.getString(2)); 

Это всегда дает исключение:

java.sql.SQLException: JZ0SG: A CallableStatement did not return as many output parameters as the application had registered for it. 
    at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source) 
    at com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(Unknown Source) 
    at com.sybase.jdbc4.jdbc.ParamManager.nextResult(Unknown Source) 
    at com.sybase.jdbc4.jdbc.ParamManager.doGetOutValueAt(Unknown Source) 
    at com.sybase.jdbc4.jdbc.ParamManager.getOutValueAt(Unknown Source) 
    at com.sybase.jdbc4.jdbc.SybCallableStatement.getString(Unknown Source) 

Я попытался с JDBC execute SQL Server stored procedure with return value and input/output parameters, https://msdn.microsoft.com/en-us/library/ms378108.aspx, но это не сработало.

+2

Показать полный создать заявление для вашей процедуры. – Jens

+0

Переменные in/out объявлены в 'CREATE PROCEDURE test AS ...'. Покажите нам ''. –

+0

@ OlivierGrégoire Я добавил заявление о создании – Harbinger

ответ

4

Есть два способа:

1. переопределять процедуру (рекомендуется)

Выходные paramteres должны быть объявлены при создании хранимой процедуры:

CREATE PROCEDURE test 
    @name varchar(32),   
    @login varchar(32) = null output, 
    @pass varchar(32) = null output, 
    @status int = -1 output 
AS 
BEGIN 
     SET @status = 0 
     SELECT @login = logincolumn, 
       @pass = passcolumn 
     FROM usertable 

END 

Затем вы можете использовать его с JDBC следующим образом:

String query = "{call test(?,?,?,?)}"; 
[...] 
proc = connection.prepareCall(query); 
proc.setString(1, "myName"); 
proc.registerOutParameter(2, java.sql.Types.VARCHAR); 
proc.registerOutParameter(3, java.sql.Types.VARCHAR); 
proc.registerOutParameter(4, java.sql.Types.INTEGER); 

Примечание:

  • Вы должны set или select в объявленных переменных, чтобы дать им выходные значения.
  • Обычно это не очень хорошая идея, чтобы передать пароли вокруг

2. Вылов результаты из нескольких ResultSets (не рекомендуется)

Connection con; 
CallableStatement proc = null; 
ResultSet rs; 

String qry = "{call test(?)}"; 
proc = con.prepareCall(qry); 
proc.setString(1, "name"); 
proc.executeQuery(); 

// first result set returning the status 
rs = proc.getResultSet(); 
if (rs.next()) { 
    System.out.println(rs.getString(1)); 
} 

// second result set returning login and pass 
if (proc.getMoreResults()) { 
    rs = proc.getResultSet(); 
    if (rs.next()) { 
     System.out.println(rs.getString("login")); 
     System.out.println(rs.getString("pass")); 
    } 
} 
+0

Вы имеете в виду объявление имен параметров. Да. Я уже сделал это. Просто включил первое и последнее высказывание proc. Я обновил его сейчас. – Harbinger

+0

Я уверен, что процесс работает нормально. Я могу сразу нажать и получить результат. Но не из jdbc – Harbinger

+0

Обновлено решение, чтобы обеспечить способ, если вы не можете изменить процедуру. – flo

Смежные вопросы