java中调用存储过程处理输出参数需先用registeroutparameter()注册输出参数类型,再用getxxx()获取值;索引从1开始,类型须与数据库一致,并用wasnull()判断null。

在 Java 中使用 CallableStatement 调用存储过程并处理输出参数,核心是两步:先用 registerOutParameter() 声明输出参数的类型,再用对应的 getXXX() 方法(如 getString()、getInt())获取值。顺序和类型必须与数据库中定义一致。
注册输出参数:用 registerOutParameter()
调用存储过程前,需明确告诉 JDBC 驱动哪些参数是输出方向,并指定其 SQL 类型(不是 Java 类型)。参数位置从 1 开始计数,对应 SQL 中的 ? 占位符顺序。
- 语法:
cs.registerOutParameter(paramIndex, sqlType) -
paramIndex是参数位置(int),从 1 开始 -
sqlType来自java.sql.Types,例如Types.VARCHAR、Types.INTEGER、Types.DATE - 如果存储过程有输入输出混合参数(
INOUT),也要注册;纯输入参数(IN)无需注册
设置输入参数(如有)
在 execute() 之前,对所有 IN 或 INOUT 参数调用 setXXX() 方法赋值:
cs.setString(1, "Alice")cs.setInt(2, 25)- 注意:输入参数的索引也从 1 开始,且要和注册输出参数的索引不冲突(同一位置不能既设又注册为输出)
执行并获取输出参数值
调用 execute() 后,才能安全读取输出参数。使用与注册类型匹配的 getXXX() 方法:
-
String name = cs.getString(3)—— 对应registerOutParameter(3, Types.VARCHAR) -
int count = cs.getInt(4)—— 对应registerOutParameter(4, Types.INTEGER) - 若数据库返回 NULL,多数
getXXX()返回对应类型的默认值(如getInt()返回 0),建议改用wasNull()判断是否为 NULL: - if (!cs.wasNull()) { /* 安全使用 */ }
完整示例(带 IN 和 OUT 参数)
假设数据库中有存储过程:CREATE PROCEDURE get_user_name(IN user_id INT, OUT user_name VARCHAR(50))
Java 调用代码:
String sql = "{call get_user_name(?, ?)}";
try (CallableStatement cs = conn.prepareCall(sql)) {
cs.setInt(1, 1001); // 设置 IN 参数
cs.registerOutParameter(2, Types.VARCHAR); // 注册 OUT 参数
cs.execute();
String name = cs.getString(2); // 获取输出值
if (cs.wasNull()) {
name = null;
}
System.out.println("Name: " + name);
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











