1

在我之前的实现中,我将 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 它不应该被锁定,或者我是否也卡住了将外循环从流式传输中切换出来?

这是一个只读应用程序(临时表除外),如果有帮助的话。

4

0 回答 0