Spring jdb c Функция вызова - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь вызвать хранимую функцию, используя класс 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());
    }
}

Я очень надеюсь на вашу поддержку. Я долго мучился

...