Я пытаюсь вызвать хранимую функцию, используя класс SimpleJdbcCall. Входной параметр является табличным типом, который может иметь несколько типов. Я не могу сделать это вообще, я получаю сообщение об ошибке, что входные параметры неверны или ошибка дескриптора. Я прошу вас помочь в решении этой проблемы, я прилагаю пример кода
public OutReport callFunction(ReportBuilder request) throws SQLException {
Connection connection = jdbcTemplate.getDataSource().getConnection();
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withFunctionName(functionName)
.declareParameters(
new SqlOutParameter("t_lost_income_rep", OracleTypes.STRUCT, "T_LOST_INCOME_REP"),
new SqlParameter("p_Date_Report_Calculate", OracleTypes.DATE),
new SqlParameter("p_Reimburse_Agreement_Number", OracleTypes.VARCHAR),
new SqlParameter("p_Report_Type", OracleTypes.NUMBER),
new SqlParameter("p_address_tab", OracleTypes.STRUCT, "T_LOST_INC_REP_ADDR"));
SqlParameterSource input = new MapSqlParameterSource()
.addValue("p_Date_Report_Calculate", request.getDateReport())
.addValue("p_Reimburse_Agreement_Number", request.getAgreementNumber())
.addValue("p_Report_Type", request.getReportType())
.addValue("p_address_tab", request.getAddressTabType());
Struct struct = simpleJdbcCall.executeFunction(Struct.class, input);
Object[] resultFunc = struct.getAttributes();
return createReport(resultFunc);
и пример сопоставления класса java с типом Oracle
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AddressTabType implements SQLData {
AddressType addressType;
@Override
public String getSQLTypeName() throws SQLException {
return "t_lost_inc_rep_addr_tab".toUpperCase();
}
@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
this.addressType = (AddressType)stream.readObject();
}
@Override
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeObject(getAddressType());
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class AddressType implements SQLData {
private BigDecimal serivceId;
private BigDecimal unom;
private String fiasId;
private String appartment;
@Override
public String getSQLTypeName() throws SQLException {
return "t_lost_inc_rep_addr".toUpperCase();
}
@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
this.serivceId = stream.readBigDecimal();
this.unom = stream.readBigDecimal();
this.fiasId = stream.readString();
this.appartment = stream.readString();
}
@Override
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeBigDecimal(getSerivceId());
stream.writeBigDecimal(getUnom());
stream.writeString(getFiasId());
stream.writeString(getAppartment());
}
}
Я очень надеюсь на вашу поддержку. Я долго мучился