You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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);
    }
}

原代码错误分析

  1. 重复声明参数:代码中两次声明POBJ参数,属于无效配置,应仅声明一次IN OUT类型参数。
  2. 参数类型标记错误:IN OUT类型参数需使用SqlInOutParameter而非SqlParameter。
  3. 对象类型不兼容:OracleJsonObject是JDBC端的JSON类型,无法直接映射到PL/SQL层的JSON_OBJECT_T对象,数据库无法识别该类型导致报错。

内容的提问来源于stack exchange,提问作者shoegazeSunshine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:25:34