JDBC调用带默认输入参数的存储过程:省略输入参数并获取输出值
JDBC调用带默认值输入参数的Oracle存储过程问题解答
问题1:即便使用默认值,是否仍需指定全部50个输入参数?
不需要。由于存储过程的所有输入参数都定义了默认值,Oracle数据库允许调用时直接省略这些输入参数,无需逐个指定。
问题2:是否有办法在CALL语句中省略这些输入参数的占位符?
有两种实用方式:
- 命名参数调用(推荐):Oracle JDBC支持通过参数名直接指定输出参数,完全跳过所有输入参数。CALL语句写法如下:
这种方式无需编写任何输入参数的占位符,所有输入参数自动使用预设的默认值。CALL create_entity(p_name => ?, p_location => ?) - DEFAULT关键字占位:如果习惯按参数位置调用,可以用
DEFAULT代替每个输入参数的占位符,但需要为50个输入参数逐一写DEFAULT,不如命名参数简便,示例结构如下:CALL create_entity(DEFAULT, DEFAULT, ..., ?, ?)
问题3:如何简便地获取输出参数的值?
通过JDBC的CallableStatement即可轻松处理,步骤如下:
- 准备调用语句(以命名参数为例):
String callSql = "{CALL create_entity(p_name => ?, p_location => ?)}"; CallableStatement cs = connection.prepareCall(callSql); - 注册输出参数的类型:
// 按参数名注册(Oracle JDBC支持) cs.registerOutParameter("p_name", Types.VARCHAR); cs.registerOutParameter("p_location", Types.NUMERIC); // 也可以按位置注册,对应CALL语句中?的顺序 // cs.registerOutParameter(1, Types.VARCHAR); // cs.registerOutParameter(2, Types.NUMERIC); - 执行存储过程:
cs.execute(); - 获取输出参数值:
String entityName = cs.getString("p_name"); Integer entityLocation = cs.getInt("p_location"); // 按位置获取的写法 // String entityName = cs.getString(1); // Integer entityLocation = cs.getInt(2); - 最后记得关闭
CallableStatement及数据库连接等资源。
内容的提问来源于stack exchange,提问作者Alex.K
相关产品推荐
相关产品推荐

