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
相关产品推荐
相关产品推荐

