0

我的 DBM 中有一个如下所示的视图:

SELECT CDN, DN_GRUPPE, AFSLUTTET_AF AS INITIALS, AGENTGRUPPE AS AGENTGROUP, STATUS, CREATED, LAST_UPD , TRUNC(LAST_UPD)- TRUNC(CREATED) AS SOLVED_SECONDS
FROM GENESYS.NYK_SIEBEL_CALLBACK_AGENT_HIST@CCON.NYKREDITNET.NET 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 应用程序尝试获取所选列SOLVED_SECONDS时,它会返回应有的值。

但是,如果我将视图更改为以下内容:

    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 GENESYS.NYK_SIEBEL_CALLBACK_AGENT_HIST@CCON.NYKREDITNET.NET 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。不是 null 不是 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 查看表格,则正确的数字会显示在列中SOLVED_SECONDS

我觉得我已经尝试了所有方法,但我似乎根本找不到问题所在。如果您需要更多信息,请告诉我!

注意-在上面的示例中,我可以从表中获取具有正确结果的任何其他列 SOLVED_SECONDS

更新

如果我使用Resultset.wasNull();我得到一个异常,说没有数据被读取。

这是SOLVED_SECONDS我的 DBM中的屏幕截图

在此处输入图像描述

这是Java的输出:

在此处输入图像描述

请注意,以下输出只是数据库中每一行的 0 继续的一小部分。

更新创建的视图:

以下是视图的完整定义:

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 
      GENESYS.NYK_SIEBEL_CALLBACK_AGENT_HIST@CCON.NYKREDITNET.NET 
  LEFT JOIN 
      KS_DRIFT.SYS_DATE_KS AA ON TO_DATE(TRUNC(LAST_UPD),'YYYY-MM-DD') = AA.THIS_DATE 
  WHERE 
      TIDSPUNKT > (SYSDATE - 427)
4

1 回答 1

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   genesys.nyk_siebel_callback_agent_hist@ccon.nykreditnet.net ");
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() : ""));

}

并在数据库中执行相同的查询。此外,请确保您在两个测试中使用相同的用户。

于 2013-04-23T13:06:08.600 回答