gpt4 book ai didi

java - Sybase 和 jdbc- Proc 返回 select 语句 - 记录无法获取

转载 作者:行者123 更新时间:2023-11-30 11:04:11 25 4
gpt4 key购买 nike

我正在从 jdbc 执行一个存储过程。该过程通过选择查询返回表“out_table”的内容,该表由 2 列键和值组成。

我在用

String query = "{? = call my_proc}";
try {
stmt = conn.prepareCall(query);
stmt.registerOutParameter(1, Types.JAVA_OBJECT);
boolean results = stmt.execute();

while (results) {
ResultSet rs = stmt.getResultSet();
if(rs.next()) {
System.out.println(rs.getString("MSG"));
System.out.println(rs.getInt("SEQ"));
}
}

我无法获得任何结果。我可以看到很多示例只从 proc 返回表的单个字段而不是整个表。 “Types.JAVA_OBJECT”类型,我不确定要使用什么。对我来说,输出表字段分别是字符串和整数。

我做错了什么?

注:my_proc:

CREATE PROCEDURE my_proc
AS
BEGIN
CREATE TABLE #tmp_table
(
MSG VARCHAR(255),
SEQ INT
)
//Insert contents into #tmp_table
..
..
..
SELECT * FROM #tmp_table ORDER BY SEQ
END
go

最佳答案

您的存储过程没有输出参数。它会生成一个 ResultSet。所以你应该在你的调用中删除 out 参数定义:

String query = "{call my_proc}";
try (CallableStatement stmt = conn.prepareCall(query)) {
boolean results = stmt.execute();
while (true) {
if (results) {
// results true means: result is ResultSet
try (ResultSet rs = stmt.getResultSet()) {
if(rs.next()) {
System.out.println(rs.getString("MSG"));
System.out.println(rs.getInt("SEQ"));
}
}
} else {
// results false means: result is update count
// or no more results if updateCount is -1
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) break;
// Do something with update count
}
// Move to next result
results = stmt.getMoreResults()
}
}

我添加了 try-with-resource 以在您使用完资源后立即正确关闭资源,我还添加了代码以正确处理多个结果,包括更新计数,这在 Sybase(和 SQL Server)中尤其如此可能会很复杂如果您的存储过程不使用 SET NOCOUNT ON。您的原始代码也有一个无限循环。

请注意,if(rs.next()) 可能需要是 while (rs.next) 如果表中可以有多个结果。

关于java - Sybase 和 jdbc- Proc 返回 select 语句 - 记录无法获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30101886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com