2013-04-23 42 views
0

我有我的DBM一種觀點認爲是這樣的:PL SQL功能使得Java應用程序返回0

SELECT CDN, DN_GRUPPE, AFSLUTTET_AF AS INITIALS, AGENTGRUPPE AS AGENTGROUP, STATUS, CREATED, LAST_UPD , TRUNC(LAST_UPD)- TRUNC(CREATED) AS SOLVED_SECONDS 
FROM [email protected] LEFT JOIN KS_DRIFT.SYS_DATE_KS AA ON TO_DATE(TRUNC(LAST_UPD),'YYYY-MM-DD') = AA.THIS_DATE 
WHERE TIDSPUNKT > (SYSDATE - 427) 

當我的Java應用程序試圖獲得所選列​​他的返回值,因爲它應該。

但是如果我改變了看法以下幾點:

SELECT CDN, DN_GRUPPE, AFSLUTTET_AF AS INITIALS, AGENTGRUPPE AS AGENTGROUP, STATUS, CREATED, LAST_UPD , CASE WHEN CALCULATE_CALLBACK_DURATION(CREATED,LAST_UPD) is NULL THEN 
CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) ELSE 
CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) END AS SOLVED_SECONDS 
FROM [email protected] LEFT JOIN KS_DRIFT.SYS_DATE_KS AA ON TO_DATE(TRUNC(LAST_UPD),'YYYY-MM-DD') = AA.THIS_DATE 
WHERE TIDSPUNKT > (SYSDATE - 427) 

即添加自己的功能(CALCULATE_CALLBACK_DURATION),那麼我的Java應用程序的結果是= 0不空不爲NaN只是0

例如,如果我用下面的代碼在我的Java應用程序:

public ArrayList<CallQueue> getCallbacks(String startDate, String endDate, 
     char c, ArrayList<CallQueue> data) { 
    DateTime end = new DateTime(endDate); 
    // this method is currently used for testing purposes 
    String sql = "SELECT SOLVED_SECONDS FROM KS_DRIFT.NYK_SIEBEL_CALLBACK_AGENT_H_V "; 
    System.out.println(sql); 
    ResultSet rs = getTable(sql); 
    try { 
     while (rs.next()) { 
      System.out.println(rs.getInt("SOLVED_SECONDS")); 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 

private ResultSet getTable(String sql){ 
    try { 
     return Hent_tabel(sql); 
    } catch (SQLException e) {e.printStackTrace();} 
    return null; 
} 

public ResultSet Hent_tabel(String Execute) throws SQLException { 
    return db.executeQuery(Execute); 
} 

在上面的示例應用程序將打印出「0」爲每個表中的行。但是,如果我通過我的DBM查看錶格中的正確數字,則顯示在列​​

我覺得我試過了所有的東西,而且根本找不到問題。如果您需要更多信息,請告訴我!

- 在上面的例子中,我能得到表中的任何其他列有正確的結果從​​

UPDATE

想到如果我使用Resultset.wasNull();我得到說沒有數據被讀取的例外。

這裏是​​的截圖在我DBM

enter image description here

這裏是從Java輸出:

enter image description here

注意下面的輸出僅僅是一個小窺數據庫中的每個行都繼續爲0。

UPDATE創建的視圖:

以下是視圖上的完整定義:

Create View KS_DRIFT.NYK_SIEBEL_CALLBACK_AGENT_H_V (CDN, DN_GRUPPE, INITIALS, AGENTGROUP, STATUS, CREATED, LAST_UPD, SOLVED_SECONDS) 
As 
    SELECT 
     CDN, DN_GRUPPE, AFSLUTTET_AF AS INITIALS, 
     AGENTGRUPPE AS AGENTGROUP, STATUS, CREATED, LAST_UPD , 
     CASE WHEN CALCULATE_CALLBACK_DURATION(CREATED,LAST_UPD) is NULL 
      THEN CALCULATE_CALLBACK_DURATION(AA.THIS_DATE_OPENING, LAST_UPD) 
      ELSE CALCULATE_CALLBACK_DURATION(CREATED, LAST_UPD) 
     END AS SOLVED_SECONDS 
    FROM 
     [email protected] 
    LEFT JOIN 
     KS_DRIFT.SYS_DATE_KS AA ON TO_DATE(TRUNC(LAST_UPD),'YYYY-MM-DD') = AA.THIS_DATE 
    WHERE 
     TIDSPUNKT > (SYSDATE - 427) 
+0

您能否將您的Java代碼更新爲您正在執行的實際代碼?您當前的代碼不會編譯... – 2013-04-23 12:32:09

+0

您確定要檢查數據庫中的第二個查詢嗎?也許視圖正在返回零,可能是因爲你的情況。 – 2013-04-23 12:33:34

+0

@MarcRasmussen:我不想太挑剔,但爲了排除你在JDBC方面做錯了什麼,我真的需要看到實際的代碼。您發佈的代碼不會編譯('.next'沒有括號,''Resultset'帶有小寫's' ...,在println()'調用中缺少右括號)。請發佈您已*成功執行的代碼*,這會給您帶來不必要的零 – 2013-04-23 12:36:43

回答

1

如果是同一個數據庫,我不明白爲什麼結果應該是不同的。您直接在數據庫中查詢您的表的值,並在Java中查看您的視圖中的值。確保你在相同的查詢在兩個並檢查結果。

我看到的是Java顯示零而不是空值的結果。這是因爲getInt()返回一個原始的int。

所以,測試我想你應該做的是:

StringBuilder query = new StringBuilder(); 
query.append(" SELECT cdn, "); 
query.append("  dn_gruppe, "); 
query.append("  afsluttet_af AS INITIALS, "); 
query.append("  agentgruppe AS AGENTGROUP, "); 
query.append("  status, "); 
query.append("  created, "); 
query.append("  last_upd, "); 
query.append("  CASE "); 
query.append("   WHEN Calculate_callback_duration(created, last_upd) IS NULL THEN "); 
query.append("   Calculate_callback_duration(AA.this_date_opening, last_upd) "); 
query.append("   ELSE Calculate_callback_duration(created, last_upd) "); 
query.append("  END   AS SOLVED_SECONDS "); 
query.append(" FROM [email protected] "); 
query.append("  left join ks_drift.sys_date_ks AA "); 
query.append("    ON To_date(Trunc(last_upd), 'YYYY-MM-DD') = AA.this_date "); 
query.append(" WHERE tidspunkt > (SYSDATE - 427) "); 

ResultSet rs = db.executeQuery(query.toString()); 
while(rs.next()) { 
    //check if the field have value or return null. It is needed when your field can return null values from the database 
    Integer solvedSeconds = rs.getObject("SOLVED_SECONDS") != null ? rs.getInt("SOLVED_SECONDS") : null; 

    System.out.println("Solved seconds: " + (solvedSeconds != null ? solvedSeconds.toString() : "")); 

} 

並在數據庫中執行此相同的查詢。另外,請確保您使用相同的用戶進行兩項測試。

+0

當我運行上面的代碼,我得到一個空指針異常:\t \t \t System.out.println(「Solved seconds:」+ solvedSeconds.toString());在toString()中使用 – 2013-04-23 13:12:27

+0

?檢查我的更新。 – 2013-04-23 13:13:50

+0

類型不匹配無法從整數轉換爲Boolean,如果我將其更改爲: \t \t \t \t的System.out.println( 「解決秒」!?+(solvedSeconds = NULL solvedSeconds.toString() 「」)) ; 然後我得到的輸出如下: 解決秒: 解決秒: 解決秒: 解決秒: 解決秒: 解決秒: 解決秒: 解決秒: 解決秒: – 2013-04-23 13:15:12