在我之前的实现中,我将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);
现在,这大部分都有效。问题是我在另一个步进查询的循环中有这个,这似乎是当我尝试删除它时表被锁定的原因。如果我最终确定该查询,它“工作”(drop工作;其他一切都会中断,因为它是逻辑的一部分)。外部查询无法引用tt
,因为我在“范围”内创建了它。
有没有办法提醒sqlite它不应该被锁定,或者我是否仍然不能将外环从流媒体中移开?
这是一个只读应用程序(临时表除外),如果有帮助的话。