java - 如何处理两个存储过程,一个返回单个值,另一个返回行?

标签 java stored-procedures jdbc sybase

我正在使用 Sybase 数据库。

假设我有一个像...这样的查询

CREATE PROCEDURE dbo.procedureA (
     @a int
  )
  as
  begin
     IF EXISTS (SELECT 1 FROM dbo.T WHERE a = @a)
         return 1
     ELSE
         return -1
   end

...以及另一个包含返回多行的简单 SELECT 查询的过程。

我必须在一个程序中处理它们。如何在运行时确定该过程是返回一个值还是一组行?

P.S: 我无法使用 OUT 参数。

最佳答案

CallableStatement 对象的 .execute() 方法返回一个 boolean 值,指示返回的(第一个)结果是否为 ResultSet。您可以使用该值来确定存储过程是否返回 ResultSet,然后获取 RETURN 值(如果有),如下所示:

try (CallableStatement s = conn.prepareCall("{ ? = CALL dbo.test3 (?) }")) {
    s.registerOutParameter(1, Types.INTEGER);
    s.setInt(2, 3);  // set input parameter to value 3, for example
    if (s.execute()) {
        // .execute() returned true, so we have a ResultSet
        System.out.println("ResultSet values:");
        try (ResultSet rs = s.getResultSet()) {
            while (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        }
        System.out.println("");
    }
    // get RETURN value (or zero if no RETURN statement in stored procedure)
    System.out.printf("RETURN value: %d%n", s.getInt(1));  
}

我没有可用于测试的 Sybase 数据库,但我验证了它可以与 jTDS 和 SQL Server 配合使用。

关于java - 如何处理两个存储过程,一个返回单个值,另一个返回行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36764304/

相关文章:

java - Topmost View 吞下触摸事件,因为重叠

java - 带逗号和不带逗号的数组

java - 如何用内部类填充 Arraylist?

java - JDBC 语句顺序

java - 如何使用单例设计模式来建立和关闭 JDBC 连接?

java - 编程语言运行时使用堆栈的主要原因是什么?

c# - 如果表存在,则返回 bool 值的 SQL Server 存储过程,c# 实现

mysql - 存储过程 - 错误 #1064

sql-server - 使用较少的输入参数执行存储过程

oracle - JDBC 连接默认自动提交行为