MySQL サーバーで大量の行を処理するスクリプトでは、 と を使用dbSendQuery
しfetch
て、結果のフェッチと処理を抑制します。
私のfetch
コマンドが結果セットで利用可能な (または残された) 行数を正確に取得すると、フェッチする行が 0 行のままになり、dbHasCompleted
返さFALSE
れると予想していたのにTRUE
.
query <- "select record_id, name
from big_table left join another_table using (record_id)
limit 500"
resultset <- dbSendQuery(con, query) # con: DB connection
while(!dbHasCompleted(resultset)) {
input <- fetch(resultset, n = 500)
print(paste("Rows fetched:", nrow(input)))
# process input ...
}
このループが 1 回実行されることを期待していましたが、処理後に余分な実行があり、print
再度呼び出されます。
Rows fetched: 500
...
Rows fetched: 0
明らかに、dbHasCompleted(resultset)
使用可能な行の正確な数がフェッチされる場合は false です (n = 1000、2000、3000 で同じ動作が観察されます)。このスクリプトで n = 501 の場合、2 番目のループはありません。
これは予想されることですか?私は何か間違ったことをしていますか?