У меня есть запрос, который имеет
... ГДЕ PRT_STATUS = 'ONT' ...
Поле prt_status определяется как CHAR (5). Так что это всегда заполнено пробелами. Запрос ничего не соответствует как результат. Чтобы этот запрос работал, мне нужно сделать
... ГДЕ rtrim (PRT_STATUS) = 'ONT'
который работает.
Это раздражает.
В то же время у нескольких клиентов СУБД, работающих на чистой Java (Oracle SQLDeveloper и AquaStudio), у меня НЕ возникает проблема с первым запросом, они возвращают правильный результат. У жабы тоже нет проблем.
Я предполагаю, что они просто переводят соединение в какой-то режим совместимости (например, 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' является литералом, и поэтому сравнивается с использованием дополняющего способа.