JDBC - Обработка данных Resultset: Странное поведение: возвращаемый размер выборки по умолчанию - PullRequest
0 голосов
/ 06 октября 2010

У меня есть процедура Oracle (10.2) PLSQL, которая извлекает 15 записей из таблицы в sysrefcursor.Затем я передаю этот курсор в класс Java в качестве набора результатов.Этот java-класс загружается в oracle.

Имя драйвера: Oracle JDBC driver Версия драйвера: 10.2.0.1.0 Основная версия драйвера: 10 Minor Version: 2

Замечания:

1 Внутри java-класса, когда я перебираю набор результатов, я получаю только первые 10 записей.

2 Если курсор был выбран (20 или более записей) или (10 или менее), я мог бы получить все записи во время итерации набора результатов.

3 Я обнаружил, что размер выборки по умолчанию для набора результатовравно 10. Если я изменю fetchSize на 5, и курсор выберет 8 записей, я мог бы получить первые 5 записей при повторении набора результатов.

4 Если курсор выбран (10 или более записей) или (5или меньше) Я мог бы получить все записи во время итерации набора результатов.

5 Если бы я изменил набор результатов fetchSize на 1, я мог бы получить все записи в наборе результатов независимо от того, сколько записей выбрано курсором.

Почему набор результатов ведет себя странно?

public static BLOB createZip(BLOB prevBlob, String outPrefix, ResultSet entries, ResultSet rs, Long[] resultRows) throws Exception
{
    OracleConnection conn = null;
    BLOB retBLOB = null;
    int page   = 1;
    int curRow = 0;
    long totalRows = 0;
    try
    {
        conn = (OracleConnection) new OracleDriver().defaultConnection();
        ArrayList entryList = loadEntries(entries);
        retBLOB = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
        retBLOB.open(BLOB.MODE_READWRITE);
        OutputStream bOut = retBLOB.setBinaryStream(0L);
        ZipOutputStream zipOut = new ZipOutputStream(bOut);
        PrintStream out = new PrintStream(zipOut);
        zipOut.putNextEntry(new ZipEntry(outPrefix + "-p" + page + ".csv"));
        writeHeader(out, entryList);
        while (rs.next())
        {
            curRow++;
            totalRows++;
            if (curRow >= maxPageSize)
            {
                zipOut.closeEntry();
                page++;
                zipOut.putNextEntry(new ZipEntry(outPrefix + "-p" + page + ".csv"));
                writeHeader(out, entryList);
                curRow = 0;
            }
            for (int i = 0; i < entryList.size(); i++)
            {
                Entry e = (Entry) entryList.get(i);
                if (i != 0)
                {
                    out.print(",");
                }
                if (e.isEscape())
                    out.print("\"" + escapeExcel(rs.getString(e.getColumn())) + "\"");
                else
                    out.print("\"" + emptyExcel(rs.getString(e.getColumn())) + "\"");
            }
            out.println();
        }

        if (totalRows == 0)
        {
            out.println("\"No Entries Found\"");
        }
        resultRows[0] = new Long(totalRows);
        out.flush();
        zipOut.closeEntry();
        if (prevBlob != null)
        {
            byte[] buf = new byte[1024];
            InputStream bIn = prevBlob.binaryStreamValue();
            ZipInputStream zipIn = new ZipInputStream(bIn);

            ZipEntry inEntry = zipIn.getNextEntry();
            while (inEntry != null)
            {
                zipOut.putNextEntry(new ZipEntry(inEntry.getName()));
                int len;
                while ((len = zipIn.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                inEntry = zipIn.getNextEntry();
            }

            zipIn.close();

            try
            {
                prevBlob.freeTemporary();
            }
            catch (SQLException e) { }

        }

        zipOut.close();
        retBLOB.close();
        return retBLOB;
    }
    catch (Exception sex)
    {
        if (retBLOB != null)
        {
            try
            {
                retBLOB.freeTemporary();
            }
            catch (SQLException e) { }
        }
        throw sex;
    }
    finally
    {

        try { entries.close(); } catch (SQLException sex) { }
        try { rs.close(); } catch (SQLException sex) { }
        try
        {
            if (conn != null || !conn.isClosed())
            {
                conn.close();
            }
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }

    }

}

1 Ответ

2 голосов
/ 07 октября 2010

Есть обходной путь. Я получил индекс столбца до while(rs.next()). Приведенный ниже фрагмент кода работает абсолютно нормально для меня. Но я все еще не понимаю, почему resultSet.getString(columnName); не удалось внутри while(rs.next()).

    ArrayList entryList = loadEntries(entries);
    int[] colIndx = new int[entryList.size()];
    ResultSetMetaData rsmd = rs.getMetaData();
    int numberOfColumns = rsmd.getColumnCount();
    for (int i = 0; i < entryList.size(); i++){
       Entry e = (Entry) entryList.get(i);
       for (int j = 1; j <= numberOfColumns; j++){
          if(rsmd.getColumnName(j).equalsIgnoreCase(e.getColumn()))
              colIndx[i] = j;
       }
    }
    try{
        while (rs.next()){
            for (int i = 0; i < colIndx.length ; i++){
                System.out.println("Column Values["+colIndx[i]+"] : "+rs.getString(colIndx[i]));
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...