如何通过JDBC从Db2匿名块返回动态结果集?

如何通过JDBC从Db2匿名块返回动态结果集?,jdbc,db2,db2-luw,Jdbc,Db2,Db2 Luw,我正在研究,它的工作方式似乎与MySQL、SQL Server中的工作方式类似,通过从任何过程逻辑中运行简单的SELECT,或者在Oracle中使用DBMS_SQL.RETURN_RESULT。以下匿名块似乎有效: 开始 声明i整数默认值为1; 而我不到10岁 开始 从sysibm.dual声明cur CURSOR并返回客户机,用于选择i; 开放cur; 设置i=i+1; 终止 结束时; 终止 但是,它会产生此警告,例如DBeaver不会获取任何结果: 过程BEGIN…END返回了9个查询结果集

我正在研究,它的工作方式似乎与MySQL、SQL Server中的工作方式类似,通过从任何过程逻辑中运行简单的SELECT,或者在Oracle中使用DBMS_SQL.RETURN_RESULT。以下匿名块似乎有效:

开始 声明i整数默认值为1; 而我不到10岁 开始 从sysibm.dual声明cur CURSOR并返回客户机,用于选择i; 开放cur; 设置i=i+1; 终止 结束时; 终止 但是,它会产生此警告,例如DBeaver不会获取任何结果:

过程BEGIN…END返回了9个查询结果集,超过了定义的限制0。。SQLCODE=464,SQLSTATE=0100E,DRIVER=4.26.14

如果这是一个程序,我必须声明:

动态结果集n


但是我如何在匿名块中声明它呢?

如果不是从过程返回,则不能返回结果集

回报 指定游标的结果表将用作从过程返回的结果集。具有 仅当包含DECLARE CURSOR语句时,RETURN才相关 与源代码的一个过程。在其他情况下,预编译器 可能会接受该条款,但该条款无效

我知道这可能只是一个示例,但返回1到10的整数不需要过程语句,以下查询也可以:

with loop(k) as (
  values 1
  union all select k+1 from loop where k < 10
)
select * from loop order by k

如果不是从过程返回,则不能返回结果集

回报 指定游标的结果表将用作从过程返回的结果集。具有 仅当包含DECLARE CURSOR语句时,RETURN才相关 与源代码的一个过程。在其他情况下,预编译器 可能会接受该条款,但该条款无效

我知道这可能只是一个示例,但返回1到10的整数不需要过程语句,以下查询也可以:

with loop(k) as (
  values 1
  union all select k+1 from loop where k < 10
)
select * from loop order by k

尝试以下方法。它至少在我的11.1上有效

    String str = 
        "begin"
    + "  declare l_c CURSOR; "
    + "  set l_c = cursor with hold for select empno from employee; "
    + "  open l_c; "
    + "  set ? = l_c; "
    + "end";
    CallableStatement st = null;
    ResultSet rs = null;
    try 
    {
        st = con.prepareCall(str);
        st.registerOutParameter (1, com.ibm.db2.jcc.DB2Types.CURSOR); 
        st.execute(); 
        rs = (java.sql.ResultSet) st.getObject(1);
        if (rs != null)
        {
          while (rs.next()) 
            System.out.println(rs.getString(1));
          rs.close();           
        }
    } ...

尝试以下方法。它至少在我的11.1上有效

    String str = 
        "begin"
    + "  declare l_c CURSOR; "
    + "  set l_c = cursor with hold for select empno from employee; "
    + "  open l_c; "
    + "  set ? = l_c; "
    + "end";
    CallableStatement st = null;
    ResultSet rs = null;
    try 
    {
        st = con.prepareCall(str);
        st.registerOutParameter (1, com.ibm.db2.jcc.DB2Types.CURSOR); 
        st.execute(); 
        rs = (java.sql.ResultSet) st.getObject(1);
        if (rs != null)
        {
          while (rs.next()) 
            System.out.println(rs.getString(1));
          rs.close();           
        }
    } ...

是的,只是个例子是的,只是个例子