You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用SQL Server带游标输出参数存储过程遇REF_CURSOR不支持错误

解决SQL Server JDBC调用带游标输出存储过程报错“REF_CURSOR is not supported”的问题

问题原因

SQL Server JDBC驱动(包括12.2最新版)不支持JDBC标准的Types.REF_CURSOR类型,必须使用驱动专属的游标类型,或者换一种更简便的存储过程写法。


解决方案1:修改Java代码适配现有存储过程

导入SQL Server JDBC驱动专属的类型类,替换Types.REF_CURSOR为SQLServerTypes.CURSOR:

import com.microsoft.sqlserver.jdbc.SQLServerTypes;

// 数据库连接等代码省略
CallableStatement cs = conn.prepareCall("{ call get_employee_by_name(?,?) }");
cs.setString(1, "mk");
// 使用驱动专属的CURSOR类型注册输出参数
cs.registerOutParameter(2, SQLServerTypes.CURSOR);
cs.execute();
ResultSet resultSet = (ResultSet) cs.getObject(2);
while (resultSet.next()) {
    // 处理查询结果,比如获取字段值:resultSet.getString("NAME")
}

解决方案2:修改存储过程(更推荐)

SQL Server存储过程可以直接返回SELECT语句的结果集,无需显式定义游标输出参数,这种方式在Java中处理更简洁:

修改后的存储过程代码

CREATE PROCEDURE get_employee_by_name
    @p_name varchar(max)
AS
BEGIN
    SELECT * FROM EMPLOYEE
    WHERE NAME LIKE @p_name + '%';
END
GO

对应的Java代码

// 数据库连接等代码省略
CallableStatement cs = conn.prepareCall("{ call get_employee_by_name(?) }");
cs.setString(1, "mk");
// 直接执行查询获取结果集
ResultSet resultSet = cs.executeQuery();
while (resultSet.next()) {
    // 处理查询结果
}

内容的提问来源于stack exchange,提问作者Dhinesh Mathiyalagan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:12