如何在Quarkus反应式Oracle客户端中设置存储过程OUT参数?
解决quarkus-reactive-oracle-client调用存储过程的OUT参数问题
要正确声明并处理OUT类型参数,不能用普通Tuple的占位字符串,得借助Vert.x Oracle Client原生的OracleTuple来指定参数方向和类型,以下是具体实现:
关键步骤与代码示例
- 导入必要类
import io.vertx.oracleclient.OracleParameter; import io.vertx.oracleclient.OracleTuple; import io.vertx.mutiny.oracleclient.MutinyOraclePreparedQuery;
- 构建包含OUT参数的元组
用OracleTuple.Builder明确标记参数类型和方向,替换原来的Tuple.of():
// 创建元组构建器 OracleTuple.Builder tupleBuilder = OracleTuple.builder(); // 添加IN参数:对应存储过程的第一个输入参数 tupleBuilder.addValue(contract); // 添加OUT参数:第二个参数,需指定存储过程中定义的参数类型 // 示例为VARCHAR类型,根据实际场景替换(比如OracleParameter.CLOB、OracleParameter.XMLTYPE等) tupleBuilder.addOutParameter(OracleParameter.VARCHAR); OracleTuple params = tupleBuilder.build();
- 执行存储过程并获取OUT参数
转换为原生Vert.x查询对象执行,执行后可从OracleTuple中读取填充后的OUT参数值:
MutinyOraclePreparedQuery query = client.preparedQuery("{CALL RSMFE02PCK.GET_ALL_XML(?,?)}"); Uni<RowSet<Row>> rowSet = query.toVertx() .execute(params) .onItem().transform(result -> { // 读取OUT参数值:索引对应参数位置(第二个参数索引为1) String outParamValue = params.getString(1); // 这里可根据业务需求处理OUT参数,比如打印、存入变量等 return result; }) .convert().toUni(); // 后续处理返回的行集数据 return rowSet.onItem().transformToMulti(set -> Multi.createFrom().iterable(set)) .onItem().transform(row -> row.getString(0));
注意事项
- 确保
quarkus-reactive-oracle-client版本为较新版本(推荐2.15+),早期版本对OUT参数支持有限。 addOutParameter的参数类型必须与存储过程中OUT参数的定义完全匹配,比如存储过程返回XMLType则用OracleParameter.XMLTYPE。- OUT参数的值会在执行后被自动填充到
OracleTuple中,通过索引(从0开始)即可获取。
内容的提问来源于stack exchange,提问作者Anyer
相关产品推荐
相关产品推荐

