Я пытаюсь получить результаты из базы данных Oracle 11.2.0.3, как в примере, приведенном в http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html.
String query = createQuery(); // SQL query to be used
System.out.println(query);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
System.out.println("output of first 10 results");
while(rs.next()){
if (i < 10){
String val1= rs.getString(1);
String val2 = rs.getString(8);
String val3 = rs.getString(13);
System.out.println("val1: " + val1 +
", val2: " + val2 + ", val3: " + val3);
}
i++;
}
Однако некоторые из возвращаемых строк отличаются от того, когда я запускаю тот же запрос в SQLDeveloper, подключенный к той же схеме БД. На самом деле, некоторые из строк, возвращаемых в ResultSet
, не соответствуют моему запросу.
Я вхожу в БД с тем же пользователем для обоих. Приложение java использует ojdbc.jar, предоставленный по адресу http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html для драйверов JDBC для Oracle Database 11g Release 2 (11.2.0.3)
Что может вызвать такой сценарий? Изменения в таблицах не производятся.
Санированный запрос:
SELECT DISTINCT T1.COL1, T1.COL2, T1.COL3, T1.COL4, T1.COL5, T1.COL6, T1.COL7, T1.COL8, T1.COL9, COL10, T1.COL11, T1.COL12, T1.COL13
FROM VIEW1 T1, VIEW2 T2
WHERE T1.COL1 = T2.COL1
AND ( (NLSSORT(T1.COL8, 'NLS_SORT=BINARY_AI')=NLSSORT(TO_DATE('2014-05-12 15:25:02', 'YYYY-MM-DD HH24:MI:SS'), 'NLS_SORT=BINARY_AI')
AND T1.COL13<'Example')
OR (NLSSORT(T1.COL8, 'NLS_SORT=BINARY_AI')<NLSSORT(TO_DATE('2014-05-12 15:25:02', 'YYYY-MM-DD HH24:MI:SS'), 'NLS_SORT=BINARY_AI')) )
AND ( T2.ANOTHERCOL = 'SOMEVALUE' AND T1.COL1 = T2.COL)
ORDER BY NLSSORT(COL8, 'NLS_SORT=BINARY_AI') DESC, COL8 DESC, T1.COL13 DESC
На выходе я получаю: val1: anid, val2: 2014-05-12 15:29:39, val3: doesnotmatter
Насколько мне известно, эта строка не должна возвращаться с 2014-05-12 15:29:39 не менее 2014-05-12 15:25:02. И действительно, эта строка не найдена, когда я запускаю запрос в SQLDeveloper.
Я предполагаю, что col8 имеет дату типа, и я думаю, что проблема в
(NLSSORT(T1.COL8, 'NLS_SORT=BINARY_AI')=NLSSORT(TO_DATE('2014-05-12 15:25:02', 'YYYY-MM-DD HH24:MI:SS'), 'NLS_SORT=BINARY_AI')
ваши действия:
если ваш SQL Developer и ваш java-клиент имеют другой формат по умолчанию для даты - вы получите другой результат
Я бы рекомендовал изменить эту строку на
T1.COL8 = TO_DATE('2014-05-12 15:25:02', 'YYYY-MM-DD HH24:MI:SS')
Кроме того, вам не нужно предложение NLSSORT в WHERE, сортировки там нет.
Теперь я думаю, что я ошибаюсь.. просто не хочу удалять все это :)
вторая попытка...
one date is 31322D6D61792D313400
another one is 31322D6D61792D313400
они не меньше, чем другие
Запрос для проверки
select
NLSSORT(TO_DATE('2014-05-12 15:25:02',
'YYYY-MM-DD HH24:MI:SS'), 'NLS_SORT=BINARY_AI'),
NLSSORT(TO_DATE('2014-05-12 15:29:39',
'YYYY-MM-DD HH24:MI:SS'), 'NLS_SORT=BINARY_AI')
from dual
Любые различия, если вместо функции изменить сеанс?:
ALTER SESSION SET NLS_COMP = 'LINGUISTIC';
ALTER SESSION SET NLS_SORT = 'BINARY_AI';
order by
предложению? Вы можете поделиться (запрос, то есть)?