如何用SimpleJdbcCall调用带IN OUT JSON_OBJECT_T的Oracle存储过程
解决ORA-03115错误:正确调用IN OUT JSON_OBJECT_T类型的Oracle存储过程
问题根源
你遇到的ORA-03115: unsupported network datatype or representation错误,本质是JDBC驱动无法直接将Java端的OracleJsonObject映射到Oracle PL/SQL层的JSON_OBJECT_T对象类型,加上代码中重复声明参数、未正确标记IN OUT类型的错误,导致数据库无法识别传递的参数类型。
解决方案
最可靠的方式是模拟DBeaver的调用逻辑,通过PL/SQL块封装调用,Java端仅处理字符串类型的JSON数据,避免直接传递PL/SQL对象类型。以下是修正后的代码:
方案:使用CallableStatement执行PL/SQL块
public void getDealList(String clientCode) throws SQLException { // 构造与DBeaver一致的PL/SQL调用块 String plsqlBlock = "DECLARE " + " v_obj JSON_OBJECT_T; " + "BEGIN " + " v_obj := JSON_OBJECT_T.parse(?); " + " " + SCHEMA_NAME + "." + CPL + "." + pName + "(pObj => v_obj); " + " ? := v_obj.stringify(); " + "END;"; // 自动管理连接和Statement资源 try (Connection conn = jdbcTemplate.getDataSource().getConnection(); CallableStatement callableStmt = conn.prepareCall(plsqlBlock)) { // 设置输入参数:传入构造好的JSON字符串 callableStmt.setString(1, String.format("{\"cli_code\":\"%s\"}", clientCode)); // 注册输出参数:接收存储过程返回的JSON字符串 callableStmt.registerOutParameter(2, java.sql.Types.VARCHAR); // 执行PL/SQL块 callableStmt.execute(); // 获取输出结果 String outputJson = callableStmt.getString(2); // 后续可根据需求处理outputJson,比如转为Java对象 System.out.println(outputJson); } }
原代码错误分析
- 重复声明参数:代码中两次声明
POBJ参数,属于无效配置,应仅声明一次IN OUT类型参数。 - 参数类型标记错误:IN OUT类型参数需使用
SqlInOutParameter而非SqlParameter。 - 对象类型不兼容:
OracleJsonObject是JDBC端的JSON类型,无法直接映射到PL/SQL层的JSON_OBJECT_T对象,数据库无法识别该类型导致报错。
内容的提问来源于stack exchange,提问作者shoegazeSunshine
相关产品推荐
相关产品推荐

