以前の実装では、sqlite3 テーブルから出力アプリケーションに直接結果をストリーミングしていました。ただし、インターフェイスを一時的なデータ構造に変更しているため、行数を取得する必要があります。それを行うための好ましい方法は、一時テーブルを使用することであるように思われるので、私のオリジナル
sprintf(query,"SELECT %s AS x, AVG(%s) AS y, AVG((%s)*(%s)) AS ysq FROM %s WHERE %s=%s AND %s GROUP BY x;",x,y,y,y,from,across,val,where);
sqlite3_prepare_v2(db, query, -1, &acResult,NULL);
while(sqlite3_step(acResult)==SQLITE_ROW) { ... }
sqlite3_finalize(acResult);
になる
sprintf(query,"CREATE TEMP TABLE tt AS SELECT %s AS x, AVG(%s) AS y, AVG((%s)*(%s)) AS ysq FROM %s WHERE %s=%s AND %s GROUP BY x;",x,y,y,y,from,across,val,where);
sqlite3_prepare_v2(db, query, -1, &acResult,NULL);
sqlite3_step(acResult);
sqlite3_finalize(acResult);
sqlite3_prepare_v2(db, "SELECT COUNT(*) FROM tt;", -1, &acResult, NULL);
sqlite3_step(acResult);
int length = sqlite3_column_int(acResult,0);
sqlite3_finalize(acResult);
sqlite3_prepare_v2(db, "SELECT x,y, ysq FROM tt;", -1, &acResult, NULL);
while(sqlite3_step(acResult)==SQLITE_ROW) { ... }
sqlite3_finalize(acResult);
sqlite3_prepare_v2(db, "DROP TABLE tt;", -1, &acResult, NULL);
sqlite3_step(acResult);
sqlite3_finalize(acResult);
今、これはほとんどうまくいきます。問題は、これが別のステッピング クエリのループ内にあることです。これは、テーブルを削除しようとするとテーブルがロックされる原因と思われます。そのクエリをファイナライズすると、それは「機能します」(ドロップは機能します。ロジックの一部であるため、他のすべては機能しません)。tt
その「スコープ」内で作成したため、外側のクエリが を参照する可能性はありません。
ロックされるべきではないことをsqliteに思い出させる方法はありますか、それとも外側のループをストリーミングから切り離して立ち往生していますか?
これは、(一時テーブルを除いて) 読み取り専用のアプリケーションです。