你能告诉我为什么这个查询在pgAdmin中有效,但不能用于使用ODBC的软件:
CREATE TEMP TABLE temp296 WITH (OIDS) ON COMMIT DROP AS
SELECT age_group AS a,male AS m,mode AS t,AVG(speed) AS speed
FROM person JOIN info ON person.ppid=info.ppid
WHERE info.mode=2
GROUP BY age_group,male,mode;
SELECT age_group,male,mode,
CASE
WHEN age_group=1 AND male=0 THEN (info_dist_km/(SELECT avg_speed FROM temp296 WHERE a=1 AND m=0))*60
ELSE 0
END AS info_durn_min
FROM person JOIN info ON person.ppid=info.ppid
WHERE info.mode IN (7) AND info.info_dist_km>2;
我得到了“42P01:错误:关系”temp296“不存在”。
我也试过“BEGIN; [...] COMMIT;” - “HY010:光标打开”。
PostgreSQL 9.0.10,由Visual C ++ build 1500,64位编译 psqlODBC 09.01.0200 Windows 7 x64
答案 0 :(得分:3)
我认为它之所以不起作用,是因为默认情况下ODBC工作在自动提交模式下。如果你按顺序执行你的陈述,那就是第一个陈述
CREATE TEMP TABLE temp296 ON COMMIT DROP ... ;
必须在完成后自动提交,从而放弃你的临时表。
不幸的是,ODBC不支持直接使用BEGIN TRANSACTION; ... COMMIT;
之类的语句来处理事务。
相反,您可以使用SQLSetConnectAttr函数禁用自动提交,如下所示:
SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0);
但是,在你这样做之后,你必须记住使用这样的SQLEndTran进行任何更改:
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
尽管WITH方法对您有用,但值得注意的是,正确使用事务比在自动提交模式下运行更快。
例如,如果您需要在表中插入许多行(数千或数百万),使用事务可以比自动提交快数百和数千倍。
答案 1 :(得分:0)
临时表在ODBC中不能通过SQLPrepare / SQLExecute可用,例如,在准备好的语句上,例如,MS SQL Server就是这样。解决方案通常是使用SQLExecDirect。