Java Statement executeQuery возвращает отличные результаты, чем в SQLDeveloper, когда выполняется тот же запрос

1

Я пытаюсь получить результаты из базы данных 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.

  • 1
    В вашем запросе есть order by предложению? Вы можете поделиться (запрос, то есть)?
  • 0
    Добавлен санированный запрос и результаты.
Показать ещё 2 комментария
Теги:
jdbc

1 ответ

2
Лучший ответ

Я предполагаю, что 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')

ваши действия:

  1. конвертировать '2014...' на сегодняшний день
  2. преобразовать результат в строку
  3. конвертировать col8 в строку с использованием формата по умолчанию для столбца даты

если ваш 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';
  • 0
    Да, в этом случае это столбец даты, но это также может быть столбец vchar.
  • 0
    Я получил 31342D30352D31322031353A32353A303200 для 15:25:02 и 31342D30352D31322031353A32393A333900 для 15:29:39, когда я попытался проверить ваш запрос в SQLDeveloper.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню