使用含返回状态的存储过程

下载 JDBC 驱动程序

可以调用的 SQL Server 存储过程是一个返回状态或结果参数的存储过程。 此状态通常用于指示存储过程执行成功还是失败。 可以使用 Microsoft JDBC Driver for SQL Server 提供的 SQLServerCallableStatement 类,调用此类存储过程并处理其返回的数据。

使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。 返回状态参数的 call 转义序列的语法如下所示:

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

注意

若要详细了解 SQL 转义序列,请参阅使用 SQL 转义序列

构造 call 转义序列时,请使用 ?(问号)字符指定返回状态参数。 此字符充当要从该存储过程返回的参数值的占位符。 要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。

注意

当 JDBC 驱动程序与 SQL Server 数据库一起使用时,registerOutParameter 方法中为返回状态参数指定的值将始终为整数,可通过使用 java.sql.Types.INTEGER 数据类型进行指定。

此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。 对于返回状态参数,其序数位置始终为 1,这是因为它始终是调用存储过程时的第一个参数。 尽管 SQLServerCallableStatement 类支持使用参数的名称来指示特定参数,但只能对返回状态参数使用参数的序号位置编号。

作为示例,在 AdventureWorks2022 示例数据库中创建以下存储过程:

CREATE PROCEDURE CheckContactCity  
   (@cityName CHAR(50))  
AS  
BEGIN  
   IF ((SELECT COUNT(*)  
   FROM Person.Address  
   WHERE City = @cityName) > 1)  
   RETURN 1  
ELSE  
   RETURN 0  
END  

该存储过程返回状态值 1 或 0,这取决于是否能在表 Person.Address 中找到 cityName 参数指定的城市。

在下面的示例中,将向此函数传递 AdventureWorks2022 示例数据库的开放式连接,然后使用 execute 方法调用 CheckContactCity 存储过程:

public static void executeStoredProcedure(Connection con) {
    try(CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");) {
        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
        cstmt.setString(2, "Atlanta");
        cstmt.execute();
        System.out.println("RETURN STATUS: " + cstmt.getInt(1));
    }
    // Handle any errors that may have occurred.
    catch (SQLException e) {
        e.printStackTrace();
    }
}

另请参阅

结合使用语句和存储过程