3

関連するScalaの質問で、私は次のように質問しました。

JDBCドライバーを使用してPostgreSQLデータベースから数百万のデータベース行を読み取る必要がある場合は、常にカーソルを使用します。そうしないと、OutOfMemoryErrorが発生します。これが私が使用するパターン(擬似コード)です:

begin transaction
execute("declare cursor...")
while (true) {
  boolean processedSomeRows = false
  resultSet = executeQuery("fetch forward...")
  while (resultSet.next()) {
    processedSomeRows = true
    ...
  }
  if (!processedSomeRows) break
}
close cursor
commit

これは慣用的なHaskellでどのように行うことができますか?

4

1 に答える 1

3

SQLカーソルのようなストリームを処理するためのまったく新しい概念があります:反復、または列挙子、またはコンジット。たとえば、コンジットライブラリに関しては、Persistent Bookから:

runResourceT $ withStmt "declare cursor..." []
    $$ mapM_ doSomethingWithSingleResult

withStmt "declare cursor..." []source行を使用して作成し、単一行を処理するためにmapM_ doSomethingWithSingleResult 作成し、に接続します。sink$$sourcesink

于 2012-10-09T13:38:24.303 に答える