Вопрос по jdbc, sybase, java – Нулевые результаты при вызове хранимой процедуры Sybase через JDBC

4

вызывая хранимую процедуру Sybase, которая возвращает несколько наборов результатов через JDBC. Мне нужно получить конкретный набор результатов, который имеет столбец с именем "Результат" Это мой код:

CallableStatement cs = conn.prepareCall(sqlCall);
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
ResultSet rs=null;
int count = 1;
boolean flag = true;
while (count < 20000 && flag == true) {
    cs.getMoreResults();
    rs = cs.getResultSet();
    if (rs != null) {
        ResultSetMetaData resultSetMetaData = rs.getMetaData();
        int columnsCount = resultSetMetaData.getColumnCount();
        if (resultSetMetaData.getColumnName(1).equals("Result")) {
            // action code resultset found 
            flag = false;
            // loop on the resultset and add the elements returned to an array list
            while (rs.next()) {
                int x = 1;
                while (x 

Ваш Ответ

1   ответ
7

getMoreResults(), Вы также игнорируете возвращаемое значениеexecute()этот метод возвращаетboolean с указанием типа первого результата:

true: результатResultSetfalse : результат - количество обновлений

Если результатtrueтогда вы используетеgetResultSet() чтобы получитьResultSet, иначеgetUpdateCount() чтобы получить количество обновлений. Если счетчик обновлений-1 значит больше нет результатов. Обратите внимание, что количество обновлений также будет-1 когда текущий результатResultSet, Также хорошо знать, чтоgetResultSet() должен возвращать ноль, если результатов больше нет или если результатом является счетчик обновлений (это последнее условие, почему вы получаете так многоnull ценности).

Теперь, если вы хотите получить больше результатов, вы звонитеgetMoreResults() (или его брат принимаетint параметр). Возвращаемое значениеboolean имеет то же значение, что иexecute(), такfalse не означает, что больше нет результатов!

Больше нет результатов, еслиgetMoreResults() возвращает ложь иgetUpdateCount() возвращается-1 (как также задокументировано в Javadoc)

По сути это означает, что если вы хотите правильно обработать все результаты, вам нужно сделать что-то вроде ниже:

boolean result = stmt.execute(...);
while(true) {
    if (result) {
        ResultSet rs = stmt.getResultSet();
        // Do something with resultset ...
    } else {
        int updateCount = stmt.getUpdateCount();
        if (updateCount == -1) {
            // no more results
            break;
        }
        // Do something with update count ...
    }
    result = stmt.getMoreResults();
}

Я предполагаю, что вы получаете большое количество обновлений, прежде чем вы получите фактический.ResultSet

Я не очень знаком с Sybase, но его двоюродный брат SQL Server имеетраздражает» функция возврата количества обновлений из хранимых процедур, если вы нет явноSET NOCOUNT ON; в начале хранимой процедуры.

ПРИМЕЧАНИЕ. Часть этого ответа основана на моем ответеВыполнитьsp_msforeachdb» в приложении Java

@Catfish Вы также можете попробовать добавитьSET NOCOUNT ON в вашем sp. Mark Rotteveel
Я столкнулся с той же проблемой с Sql Server, и выОтвет помог мне решить его. Я не мог понять, почемуstmt.execute() с некоторыми данными вернетсяfalse хотя я мог ясно видеть данные в наборах результатов, возвращаемых при запуске его вручную. Я'Я до сих пор не уверен, что понимаюupdateCount() так как я неЯ считаю, что хранимый процесс обновляет любые данные. Catfish
Я неу него нет доступа для изменения сохраненного процесса. Вы'Ответ, кажется, работает в моем случае. Благодарю. Catfish

Похожие вопросы