Sybase 和 jdbc- Proc returns select 语句 - 无法获取记录
Sybase and jdbc- Proc returns select statement - records not able to get
我正在执行来自 jdbc 的存储过程。过程 returns table 'out_table' 的内容,其中包含 2 列键和值,通过 select 查询。
我正在使用
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"));
}
}
我无法获得任何结果。我可以看到很多示例,returns 只是来自 proc 的 table 的一个字段,而不是整个 table。类型 'Types.JAVA_OBJECT',我不知道该用什么。对我来说,输出的 table 字段分别是 string 和 int。
我做错了什么?
注: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服务器)如果您的存储过程不使用 SET NOCOUNT ON
,则可能会很复杂。您的原始代码也有一个无限循环。
请注意,如果 table 中可以有多个结果,则 if(rs.next())
可能需要 while (rs.next)
。
我正在执行来自 jdbc 的存储过程。过程 returns table 'out_table' 的内容,其中包含 2 列键和值,通过 select 查询。
我正在使用
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"));
}
}
我无法获得任何结果。我可以看到很多示例,returns 只是来自 proc 的 table 的一个字段,而不是整个 table。类型 'Types.JAVA_OBJECT',我不知道该用什么。对我来说,输出的 table 字段分别是 string 和 int。
我做错了什么?
注: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服务器)如果您的存储过程不使用 SET NOCOUNT ON
,则可能会很复杂。您的原始代码也有一个无限循环。
请注意,如果 table 中可以有多个结果,则 if(rs.next())
可能需要 while (rs.next)
。