Ассоциированный выделить курсор набор результатов вопрос - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь запустить этот код, который я нашел по этой ссылке: http://www.sqlines.com/db2-to-oracle/process_result_sets_in_procedures

Я почти уверен, что когда я запускаю свою хранимую процедуру, она возвращает нужные мне значения, но когда я помещаю ее в свой метод alloc (cur) и выбираю значение, она ничего не возвращает.

CALL MYSTOREDPROC();

ASSOCIATE RESULT SET LOCATOR (result) WITH PROCEDURE MYSTOREDPROC;
ALLOCATE cur CURSOR FOR RESULT SET result;
FETCH cur INTO p_name;
CLOSE cur; 
  1. Я попытался запустить его непосредственно на db2, и он успешно работает, что означает, что он работает без ошибок, но я не могу подтвердить, действительно ли он возвращает набор результатов,
  2. Я пытался вызвать его через jdbc, он возвращает это исключение

    Исключение в потоке "main" com.ibm.db2.jcc.c.SqlException: [IBM] [db2] [ОКК] [10100] [10910] java.sql.CallableStatement.executeQuery () был вызван, но без набора результатов был возвращен. Используйте java.sql.CallableStatement.executeUpdate () для без запроса

Мой вопрос:

Как я узнаю, действительно ли «результат» введен в «cur»?

Вот как я называю свою хранимую процедуру:

String ret = "";
statement = connection.prepareCall("{CALL SP_CALLER(?)}");
statement.registerOutParameter(1, java.sql.Types.VARCHAR);
resultSet = statement.executeQuery();   
resultSet.next();
ret = resultSet.getString(1);   
resultSet.close();
closeAllConnection();
return ret;

на основе исключения указывает на db2, что не возвращает никакого значения.

ОБНОВЛЕНО

Вот моя хранимая процедура:

CREATE OR REPLACE PROCEDURE ITRS.SP_CALLER()
DYNAMIC RESULT SETS 1

BEGIN

DECLARE loc_cursor RESULT_SET_LOCATOR VARYING;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE v_useraccountid SMALLINT;
DECLARE v_roleid SMALLINT;
DECLARE v_userid VARCHAR(20);
DECLARE v_username VARCHAR(50);
DECLARE v_lastlogindate TIMESTAMP;
DECLARE v_deleted SMALLINT;

DECLARE ret CURSOR WITH RETURN FOR
SELECT * from ITRS.DUMBTABLE where username='JOHN';


CALL ITRS.PR_USERACCOUNTGETALL();

ASSOCIATE RESULT SET LOCATOR (loc_cursor) WITH PROCEDURE ITRS.PR_USERACCOUNTGETALL;
ALLOCATE cur CURSOR FOR RESULT SET loc_cursor;

ins_loop: 
LOOP
FETCH cur INTO v_useraccountid,v_roleid,v_userid,v_username,v_lastlogindate,v_deleted;
  IF SQLSTATE <> '00000' THEN LEAVE ins_loop; END IF;
  INSERT INTO ITRS.DUMBTABLE(USERACCOUNTID,ROLEID,USERID,USERNAME,LASTLOGINDATE,DELETED)
 VALUES(v_useraccountid,v_roleid,v_userid,v_username,v_lastlogindate,v_deleted);
END LOOP ins_loop;

CLOSE cur;
open ret;
END

1 Ответ

0 голосов
/ 22 апреля 2019

Неправильная последовательность вызовов.
Вы должны использовать правильные вызовы для извлечения набора результатов из хранимой процедуры.
Извлечение известного количества наборов результатов из хранимой процедуры в приложении JDBC :

CallableStatement cstmt;
ResultSet rs;
int i;
String s;
…
cstmt.execute();                        // Call the stored procedure       1 
rs = cstmt.getResultSet();              // Get the first result set        2 
while (rs.next()) {                     // Position the cursor             3 
 i = rs.getInt(1);                      // Retrieve current result set value
 System.out.println("Value from first result set = " + i);  
                                        // Print the value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...