У меня есть функция 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.ВЫПУСК]
PreparedStatement
? - person lexicore   schedule 04.04.2018PreparedStatement
и полным исключением. Я не думаю, что вам нужны пунктыWHERE
илиLIKE
, чтобы иметь возможность использоватьPreparedStatement
. - person lexicore   schedule 04.04.2018?
в трассировке стека. Ваша проблема в ORA-22905 -TABLE of RECORD
можно использовать только в PL/SQL, а не в SQL. См. этот ответ: stackoverflow.com/questions/19208264/ - person kfinity   schedule 04.04.2018