【问题标题】:Associate allocate cursor result set question关联分配游标结果集问题
【发布时间】:2019-09-11 07:46:57
【问题描述】:

我正在尝试运行在此链接中找到的代码:http://www.sqlines.com/db2-to-oracle/process_result_sets_in_procedures

我很确定当我运行我的存储过程时,它会返回我需要的值,但是当我把它放到我的 allocate '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调用它,它返回这个异常

    线程“主”com.ibm.db2.jcc.c.SqlException 中的异常: [ibm][db2][jcc][10100][10910] java.sql.CallableStatement.executeQuery() 被调用但没有结果集 被退回。使用 java.sql.CallableStatement.executeUpdate() 非查询

我的问题:

我怎么知道'result'是否真的放在'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

【问题讨论】:

  • 显示调用此 SP 并处理 ResultSet 的 java 代码。
  • 我更新了帖子。请检查标记
  • 请出示您的存储过程的代码
  • 我更新了我的帖子标记。请检查谢谢

标签: java stored-procedures jdbc db2


【解决方案1】:

错误的调用顺序。
您应该使用正确的调用从存储过程中检索结果集。
Retrieving a known number of result sets from a stored procedure in a JDBC application:

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
}

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 2011-12-25
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多