我的目标是:
我有一个SELECT查询,我想在一个包含很多行的数据库上运行。这个查询将产生很多结果,所以我想在LIMIT 1000OFFSET ?的迭代中运行它,其中?将是每次迭代中处理的最后一行。
如:
获取第1-1000行
获取第1001-2000行
获取行2001-3000
获取第3001-4000行
...
我正在考虑在一个循环中执行它,在这个循环中,每个新的迭代都会将最后一个迭代的行设置为新的迭代的OFFSET(例如:OFFSET 1001OFFSET 2001,等等,如上图所示)。
我刚开始使用JDBC,那么这是正确的方法吗?如果是,那么当我必须执行它并获得每次迭代的结果时,如何重用PreparedStatement
如果这不是正确的方法,那么正确的方法是什么?
编辑:
这是我当前的代码:

private static void import(Date from, Date to) throws Exception {

    PreparedStatement p = connect.prepareStatement(statement);
    p.setInt(1, 0);
    p.add
    ResultSet results;
    for (int i=0; i< WAVES; i++) {
        results = p.executeQuery();
        Integer lastRow = importFrom(results);
        p.setInt(1, lastRow.intValue()+1);
        results.close();
    }
    p.close();
}

编辑2:
下面是SQL字符串:
SELECT
item.aitem_id, item.action_type, item.user_id, item.pid, item.pr_id, item.action_time, item.notes, item.screen, item.vid, item.lo_id,
vals.value_name, vals.simple_int_value, vals.simple_double_value, vals.simple_date_value, vals.simple_string_value,
data.version_id, data.prev_version_id
FROM mySchema.aitems item
JOIN mySchema.avalues vals ON item.aitem_id=vals.aitem_id
JOIN mySchema.adata data ON item.aitem_id=data.aitem_id
LIMIT 1000 OFFSET ?;

我修改了代码和SQL,只使用OFFSET进行准备。

最佳答案

您所做的是正确的,但最好添加对clearParameters()的调用并使用try finally块。下面是我将如何实现它

PreparedStatement p = null;
ResultSet results = null;
Integer lastRow = 0;
try
{
    p = connect.prepareStatement(statement);
    p.add

    for (int i=0; i< WAVES; i++)
    {
        p.clearParameters();
        p.setInt(1,lastRow.intValue() + 1)
        try  // This try might not really be necessary
        {
            results = p.executeQuery();
            Integer lastRow = importFrom(results);
            p.setInt(1, lastRow.intValue()+1);
        } // Add dealing with exceptions
        finally
        {
            results.close();
        }
    }
} //Add dealing with exceptions
finally
{
    p.close();
}

关于java - 如何重用取决于执行结果的PreparedStatement,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18905713/

10-15 21:00