Pl SQL函数使java应用程序返回0

Pl SQL函数使java应用程序返回0,java,plsql,Java,Plsql,我的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_D

我的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应用程序尝试获取所选列
已解决\u 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)
Ie添加我自己的函数(
CALCULATE\u CALLBACK\u DURATION
),那么我的Java应用程序的结果是=0。不为空,不为空,仅为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);
}

如果是同一个数据库,我不明白为什么结果会不同。您直接在数据库中查询表的值,在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() : ""));

}

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

能否将Java代码更新为您正在执行的实际代码?您当前的代码无法编译…您确定要检查数据库中的第二个查询吗?也许视图返回零,可能是因为您的情况。@MarcRasmussen:我不想太挑剔,但为了排除您在JDBC方面做了一些错误,我确实需要查看实际代码。您发布的代码将无法编译(
.next
不带括号,
Resultset
带小写的
s
…,调用
println()
时缺少右括号)。请发布您已成功执行的代码,这会给您带来不需要的信息zeroes@SérgioMichels视图在数据库中显示了正确的数字,因此我假设查询执行正确。下一步是输入错误?应该是next()。当我运行上面的代码时,我得到一个空指针示例:System.out.println(“Solved seconds:+solvedSeconds.toString());如果将类型不匹配更改为:System.out.println(“已解决秒数:+(solvedSeconds!=null?solvedSeconds.toString():”),则无法将其从整数转换为布尔值;然后我得到以下输出:已解决秒数:已解决秒数:已解决秒数:已解决秒数:已解决秒数:已解决秒数:已解决秒数:已解决秒数:抱歉,我对Groovy上瘾:-)再次检查。然后您的案例返回null。在数据库中运行相同的查询并查看结果…如果在数据库中运行该查询,则会得到一个结果,并且正确显示已解决的秒数
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() : ""));

}