【问题标题】:Sybase and jdbc- Proc returns select statement - records not able to getSybase 和 jdbc-Proc 返回 select 语句 - 无法获取记录
【发布时间】:2015-07-18 01:47:06
【问题描述】:

我正在从 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

【问题讨论】:

  • 你的存储过程是否返回了一些东西?你能发布你的存储过程代码吗?

标签: java stored-procedures jdbc sybase


【解决方案1】:

您的存储过程没有输出参数。它会产生一个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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2021-03-18
    • 2016-12-16
    • 1970-01-01
    • 2014-04-11
    • 2018-12-17
    • 2011-12-06
    相关资源
    最近更新 更多