当运行相同的查询时,Java Statement executeQuery返回的结果与SQLDeveloper中的不同



我试图从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++;
}

然而,当我在连接到相同DB模式的SQLDeveloper中运行相同的查询时,返回的一些行不同。实际上,在ResultSet中返回的一些行与我的查询不匹配。

我用相同的用户登录到DB。java应用程序正在使用在http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html上为Oracle数据库11g Release 2 (11.2.0.3) JDBC驱动程序提供的ojdbc.jar

什么会导致这样的情况发生?没有对所涉及的表进行任何更改。

净化后的查询:

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的类型是date,我想你的问题在

(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开发人员和你的java客户端有不同的默认日期格式,你会得到不同的结果

我建议将这一行改为

T1.COL8 = TO_DATE('2014-05-12 15:25:02', 'YYYY-MM-DD HH24:MI:SS')

同样,你不需要在WHERE子句中使用NLSSORT,那里没有排序。

现在我想我错了。只是不想全部删除:)

第二次尝试……

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

如果不是function,而是modify session,有什么区别吗?:

ALTER SESSION SET NLS_COMP = 'LINGUISTIC';
ALTER SESSION SET NLS_SORT = 'BINARY_AI';

最新更新