Вызов функции в пакете, который возвращает таблицу, предотвращающую внедрение SQL

У меня есть функция Oracle внутри пакета, которую я не могу изменить. Моя функция возвращает таблицу записей. Чтобы получить нужные мне записи, я использую следующий запрос, где FUN_WF_BLOCO1_CC_MOVIMENTOS — моя функция.

SELECT * FROM TABLE (Schema.Function('474','0000',1119940000084,'1997-02-23','2017-03-07','M',0,999999999999999.99))

Как лучше всего вызвать его в приложении SpringBoot? Я пробовал много альтернатив, и единственный способ, который я мог найти, это

    List<ConsultaMovimentoOutput> lst = null;
    String sqlQuery = "SELECT *  FROM TABLE  (Schema.Function(?, ?, ?, ?, ?, ?, ?, ?))";
    sqlQuery = Utils.resolveSqlArgs(sqlQuery, filter.getZcliente(), filter.getCkbalcao(), filter.getCknumcta(),
            filter.getDtinicio(), filter.getDtfim(), filter.getTpdata(), filter.getVlmovmin(),
            filter.getVlmovmax());

    try {
        lst = jdbcTemplate.query(sqlQuery, new ConsultaMovimentoRowMapper());
    } catch (DataAccessException e) {
        LOGGER.error("Failure in Consulta Movimentos ", e);
    }

    return lst;


public static String resolveSqlArgs(String sql, Object... args) {

    String temp = sql.replace("?", "'%s'");
    temp = String.format(temp, args);

    return temp;
}

Я использую sql.replace для замены моих аргументов на '?' но я думаю, что это очень слабо для предотвращения SQL-инъекций. Есть ли лучший способ сделать мой запрос, чем SELECT * FROM TABLE? Я не могу использовать подготовленныйStatement, потому что у меня есть значения для установки, но нет переменных для установки в моем запросе, таких как предложение «где» или «как». Есть ли лучший способ сделать это без sql.replace?

Спасибо

[РЕДАКТИРОВАТЬ]

У меня есть следующий код, который возвращает ORA-22905 с использованием MapSqlParameterSource.

StringBuilder query = new StringBuilder("SELECT *  FROM TABLE  (Schema.Function(?, ?, ?, ?, ?, ?, ?, ? ))");

Object[] params = new Object[]{
    consultaMovimentosFilter.getzClienteIn(), 
    consultaMovimentosFilter.getCkBalcao(),
    Long.parseLong(consultaMovimentosFilter.getNrProces()),
    consultaMovimentosFilter.getDtFim(),
    consultaMovimentosFilter.getDtFim(),
    consultaMovimentosFilter.getIdDtValMov(),
    Long.parseLong(consultaMovimentosFilter.getVlMontMin()),
    Double.parseDouble(consultaMovimentosFilter.getVlMonMax())
};

List<ConsultaMovimentosOut> lst = null;
MapSqlParameterSource parameters = new MapSqlParameterSource();

return jdbcTemplate.query(query.toString(), params, new ConsultaMovimentosRowMapper());

мой jdbctemplate автоматически подключается:

  @Autowired
  private JdbcTemplate jdbcTemplate;

[РЕДАКТИРОВАТЬ 2]

Ошибка сервера:

2018-04-04 11:59:09.895 DEBUG 1096 --- [nio-8080-exec-1] osjdbc.support.SQLErrorCodesFactory: найдены коды ошибок SQL для «Oracle» 2018-04-04 11:59:09.895 DEBUG 1096 --- [nio-8080-exec-1] osjdbc.support.SQLErrorCodesFactory : Коды ошибок кэширования SQL для DataSource [org.apache.tomcat.jdbc.pool.DataSource@4ffced4e]: имя продукта базы данных — «Oracle» 2018 -04-04 11:59:09.895 DEBUG 1096 --- [nio-8080-exec-1] sjsSQLErrorCodeSQLExceptionTranslator : невозможно перевести SQLException с кодом ошибки «22905», теперь попробуем резервный переводчик 2018-04-04 11: 59:09.895 DEBUG 1096 --- [nio-8080-exec-1] osjsSQLStateSQLExceptionTranslator: извлечен класс состояния SQL "99" из значения "99999" 04.04.2018 11:59:09.905 ОШИБКА 1096 --- [nio- 8080-exec-1] ctnwservices.web.Bloco1Controller: Исключение возникло в findAllDetalheContrato

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; некатегоризированное SQLException для SQL [SELECT * FROM TABLE (schema.Function(?, ?, ?, ?, ?, ?, ?, ? ))]; состояние SQL [99999]; код ошибки [22905]; ORA-22905: нет возможности получить доступ к linhas a partir de um item de uma tabela não encadeada ; вложенным исключением является java.sql.SQLException: ORA-22905: нет возможности получить доступ к linhas a partir de um item de uma tabela não encadeada

на org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) ~[spring-jdbc-4.3.7.RELEASE.jar:4.3.7.RELEASE] на org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator. translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.3.7.RELEASE.jar:4.3.7.RELEASE] в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring -jdbc-4.3.7.RELEASE.jar:4.3.7.RELEASE] в org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) ~[spring-jdbc-4.3.7.RELEASE.jar: 4.3.7.ВЫПУСК]


person João Baptista    schedule 04.04.2018    source источник
comment
Вы ищете PreparedStatement?   -  person lexicore    schedule 04.04.2018
comment
Я не могу использовать подготовленный статемент, по крайней мере, стандартным способом, потому что моя функция возвращает таблицу, и у меня нет предложений where. Если я использую prepareStatement, я получаю ORA-22905.   -  person João Baptista    schedule 04.04.2018
comment
На эту стоит обратить внимание. Опубликуйте код с PreparedStatement и полным исключением. Я не думаю, что вам нужны пункты WHERE или LIKE, чтобы иметь возможность использовать PreparedStatement.   -  person lexicore    schedule 04.04.2018
comment
Я отредактировал и разместил код. Не могу написать это здесь, потому что это слишком долго   -  person João Baptista    schedule 04.04.2018
comment
И исключение, которое вы получаете, включая детали?   -  person lexicore    schedule 04.04.2018
comment
журнал не добавляет многого, но я все равно опубликовал его. Я не знаю почему, но почему-то аргументы не анализируются в запросе   -  person João Baptista    schedule 04.04.2018
comment
Аргументы передаются нормально, они обычно отображаются как ? в трассировке стека. Ваша проблема в ORA-22905 - TABLE of RECORD можно использовать только в PL/SQL, а не в SQL. См. этот ответ: stackoverflow.com/questions/19208264/   -  person kfinity    schedule 04.04.2018
comment
@kfinity спасибо. Проблема в том, что я не могу изменить PL/SQL. Я думаю, что единственным решением является использование sql.replace для замены? для аргументов, что является проблемой из-за инъекции   -  person João Baptista    schedule 04.04.2018