Как использовать подстановочный знак SQL в PreparedStatement с переменной - PullRequest
2 голосов
/ 26 августа 2011

На моем веб-сайте мне нужно выполнить групповой запрос со значением, предоставленным конечным пользователем. Лучше всего использовать PreparedStatement в основном, чтобы избежать SQL-инъекций. Мой запрос очень очень длинный, так что это пример:

String query = "SELECT ... FROM ... WHERE ..."+ //
"AND UPPER(CUST_NAME) LIKE UPPER('%?%')";
PreparedStatement pstmt = conn.prepareStatement(query);
stmt.setString(1, "joe");

Проблема в том, что setString () выдает исключение: исключение SQL: недопустимый индекс столбца

Ответы [ 3 ]

4 голосов
/ 26 августа 2011

Вместо использования оператора concat вы можете использовать

like upper('%' || ? || '%')

чуть более читабельно.

3 голосов
/ 26 августа 2011

Попробуйте:

String query = "SELECT ... FROM ... WHERE ..."+ //
"AND UPPER(CUST_NAME) LIKE UPPER(?)";
PreparedStatement pstmt = conn.prepareStatement(query);
stmt.setString(1, "%joe%");
1 голос
/ 26 августа 2011

Заменить ...

UPPER('%?%')

... на ...

UPPER(?)

... затем установите значение параметра как:

pstmt.setString(1, "%joe%");

Кстати, этот запрос может привести к снижению производительности.Для хорошей производительности вам понадобится функциональный индекс для UPPER(CUST_NAME) («нормального» индекса для CUST_NAME недостаточно) и вам нужно будет выполнять запрос только по префиксу (например, «joe%»),Запросы по суффиксу (например, «% joe» или «% joe%») не могут быть ускорены индексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...