如何通过JDBC从Db2匿名块返回动态结果集?
我正在研究,它的工作方式似乎与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如何通过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个查询结果集
但是我如何在匿名块中声明它呢?如果不是从过程返回,则不能返回结果集 看 回报 指定游标的结果表将用作从过程返回的结果集。具有 仅当包含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();
}
} ...
是的,只是个例子是的,只是个例子