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

时间:2014-06-06 17:19:41

标签: java sql oracle jdbc

我试图从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应用程序使用http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html提供的ojdbc.jar作为Oracle Database 11g第2版(11.2.0.3)JDBC驱动程序

什么可能导致这种情况发生?所涉及的表格没有变化。

已清理的查询:

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 个答案:

答案 0 :(得分:2)

我猜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. 使用日期列的默认格式
  4. 将col8转换为字符串

    如果您的SQL Developer和您的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
    

    如果不是函数,修改会话会有什么不同吗?:

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