2013-04-23 3 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 приложение пытается получить выбранный столбец 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 [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, в столбце отображается нужный номер SOLVED_SECONDS

Я чувствую, что я пробовал все, и я просто не могу найти проблему. если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Примечание - в приведенном выше примере я могу получить любой другой столбец в таблице с правильным результатом ожидать отSOLVED_SECONDS

UPDATE

Если я использую Resultset.wasNull(); я получаю исключение, поскольку данные не были прочитаны.

Вот скриншот SOLVED_SECONDS в моем 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 до фактического кода, который вы выполняете? Ваш текущий код не будет компилироваться ... –

+0

Вы уверены, что проверяете свой второй запрос в базе данных? Возможно, представление возвращает нуль, вероятно, из-за вашего дела. –

+0

@MarcRasmussen: Я не хочу быть слишком придирчивым, но чтобы исключить, что вы делаете что-то не так на стороне JDBC, мне действительно нужно увидеть фактический код. Ваш опубликованный код не будет компилироваться ('.next' без круглых скобок,' Resultset' с строчными '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '). Пожалуйста, отправьте код, который вы * успешно выполнили *, который дает вам ненужные нули –

ответ

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

Когда я запускаю приведенный выше код, я получаю exepection nullpointer: \t \t \t System.out.println («Разрешенные секунды:» + resolvedSeconds.toString()); –

+0

в toString()? Проверьте мое обновление. –

+0

тип несоответствие не может преобразовать из целого в булево, если я изменить его на: \t \t \t \t System.out.println ("Решаемые секунд:"!? + (SolvedSeconds = нуль solvedSeconds.toString(): "")) ; Тогда я получаю следующий результат: Решаемых секунд: Решаемых секунд: Решаемых секунд: Решаемых секунд: Решаемых секунд: Решаемых секунды: Решаемых секунд: Решаемых секунд: Решаемых секунд: –

Смежные вопросы