如何从 Java Spring boot 应用程序调用具有自定义复杂对象类型作为 OUTPUT 参数的 Oracle PL-SQL 过程

问题描述 投票:0回答:0

我试图从 Spring 引导应用程序调用带有多个 IN 和 OUT 参数的 Oracle Procedure。 OUT 参数之一是嵌套的自定义对象类型。我正在寻找一种从 Java 代码调用过程并返回所有输出参数的方法。

create or replace TYPE  DS_INT_RMS_VOLUME_TBL IS TABLE OF PUB.DS_INT_RMS_VOLUME_OBJ;
create or replace TYPE     DS_INT_RMS_VOLUME_OBJ AS OBJECT
(
 order_month         VARCHAR2(20),
 ds_ppv              NUMBER,
 ds_dlv              NUMBER,
 ds_pv               NUMBER,
 ds_gv               NUMBER,
 ds_tv               NUMBER,
 ds_ro               NUMBER,
 ds_mpv              NUMBER,
 ds_mtv              NUMBER,
 ds_3ppv             NUMBER,
 ds_12ppv            NUMBER,
 ds_cv               NUMBER,
 chr_attribute1      NUMBER,
 chr_attribute2      NUMBER,
 dte_attribute2      DATE,
 ds_3dlv             NUMBER,
 ds_12dlv            NUMBER,
 ds_6ppv             NUMBER,
 ds_6dlv             NUMBER,
 ds_2ppv             NUMBER,
 mb_points           NUMBER,
 rms_volumes         ds_rms_vol_obj_tab,
 country_volumes         CTRY_INT_VOLTYPE_TAB,
 cdlv           NUMBER,
    CONSTRUCTOR FUNCTION DS_INT_RMS_VOLUME_OBJ
      RETURN SELF AS RESULT
)

以上代码是oracle db中的自定义类型

包装内的流程如下:

PROCEDURE get_rms_volumes_info (
      out_chr_err_code               OUT VARCHAR2,
      out_chr_err_msg                OUT VARCHAR2,
      out_chr_ds_id                  OUT VARCHAR2,
      out_ds_volume_tab              OUT DS_INT_RMS_VOLUME_TBL,
      out_ds_primary_volume          OUT NUMBER,
      ...some more out paramter of type number....
      in_chr_debug                IN     VARCHAR2 DEFAULT g_chr_no,
      in_chr_service_consumer     IN     VARCHAR2,
      in_chr_ds_id                IN     VARCHAR2,
      in_chr_from_month           IN     VARCHAR2,
      in_chr_to_month             IN     VARCHAR2,
      include_Order_purpose       IN     VARCHAR2,
      inventory_order_month       IN     VARCHAR2);

我试过的代码

public Map<String, Object> getVolumesInfo(Student student) {
        SqlReturnArray sqlReturnArray=new SqlReturnArray();
        SimpleJdbcCall simpleJdbcCall=new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("get_rms_volumes_info")
                .withCatalogName("DS_INT_COMMON_PKG")
                .withoutProcedureColumnMetaDataAccess()
                .declareParameters(new SqlParameter[]{
                        new SqlOutParameter("out_chr_err_code", Types.VARCHAR),
                        new SqlOutParameter("out_chr_err_msg", Types.VARCHAR),
                        new SqlOutParameter("out_chr_ds_id", Types.VARCHAR),
                        new SqlOutParameter("out_ds_volume_tab", Types.ARRAY,"DS_INT_RMS_VOLUME_TBL",sqlReturnArray),
                        .....some more out parameters.....,
                        new SqlParameter("in_chr_debug", Types.VARCHAR),
                        new SqlParameter("in_chr_service_consumer", Types.VARCHAR),
                        new SqlParameter("in_chr_ds_id", Types.VARCHAR),
                        new SqlParameter("in_chr_from_month", Types.VARCHAR),
                        new SqlParameter("in_chr_to_month", Types.VARCHAR),
                        new SqlParameter("include_Order_purpose", Types.VARCHAR),
                        new SqlParameter("inventory_order_month", Types.VARCHAR),

                        }
                );
        Map<String,String> in = new HashMap<>();
        in.put("in_chr_debug","N");
        in.put("in_chr_service_consumer","MYHL");
        in.put("in_chr_ds_id","STAFF");
        in.put("in_chr_from_month","202208");
        in.put("in_chr_to_month","202208");
        in.put("include_Order_purpose","Y");
        in.put("inventory_order_month","Y");
        Map<String,Object> out=new HashMap<>();
        out=simpleJdbcCall.execute(in);
        return out;
    }

上面的代码给出错误“com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 直接自引用导致循环(通过引用链:java.util.LinkedHashMap["out_ds_volume_tab"]-> oracle.sql.STRUCT[0]->oracle.sql.STRUCT["physicalConnection"]->oracle.jdbc.driver.T4CConnection["wrapper"])"

java oracle spring-boot stored-procedures spring-jdbc
© www.soinside.com 2019 - 2024. All rights reserved.