У меня есть запрос, который имеет
... ГДЕ PRT_STATUS='ONT' ...
Однако поле prt_status определено как CHAR(5). Поэтому он всегда заполняется пробелами. В результате запрос ничего не соответствует. Чтобы этот запрос работал, я должен сделать
... ГДЕ rtrim(PRT_STATUS)='ONT'
что работает.
Это раздражает.
В то же время у пары чисто Java-клиентов СУБД (Oracle SQLDeveloper и AquaStudio) у меня НЕ возникает проблемы с первым запросом, они возвращают правильный результат. У TOAD тоже нет проблем.
Я предполагаю, что они просто переводят соединение в некоторый режим совместимости (например, ANSI), поэтому Oracle знает, что CHAR(5) должен сравниваться без учета завершающих символов.
Как я могу сделать это с объектами Connection, которые я получаю в своем приложении?
ОБНОВЛЕНИЕ Я не могу изменить схему базы данных.
РЕШЕНИЕ Именно так Oracle сравнивает поля с переданными параметрами.
Когда привязка завершена, строка передается через PreparedStatement.setString(), который устанавливает тип в VARCHAR, и, таким образом, Oracle использует сравнение без дополнений - и терпит неудачу.
Я пытался использовать setObject(n,str,Types.CHAR). Не удается. Декомпиляция показывает, что Oracle игнорирует CHAR и снова передает его как VARCHAR.
Вариант, который наконец работает,
setObject(n,str,OracleTypes.FIXED_CHAR);
Однако это делает код не переносимым.
Клиенты пользовательского интерфейса преуспевают по другой причине — они используют символьные литералы, а не привязку. Когда я набираю PRT_STATUS='ONT', 'ONT' является литералом, и поэтому сравнивается с использованием дополнения.