Я пытаюсь запустить этот код, который я нашел по этой ссылке: 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;
- Я попытался запустить его непосредственно на db2, и он успешно работает, что означает, что он работает без ошибок, но я не могу подтвердить, действительно ли он возвращает набор результатов,
Я пытался вызвать его через 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