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)