我试图从 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"])"