簡體   English   中英

運行同一查詢時,Java語句executeQuery返回的結果與SQLDeveloper中返回的結果不同

[英]Java Statement executeQuery returns different results than in SQLDeveloper when the same query is run

我正在嘗試從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 for 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:didnotmatter

據我所知,自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 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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM