以下DECLARE
失败:
PREPARE stmt(bigint) AS SELECT ...;
DECLARE crs CURSOR FOR stmt;
根据https://www.postgresql.org/docs/9.6/static/sql-declare.html,
stmt
必须是SELECT
或VALUES
命令。
我在代码的延迟关键部分使用PREPARE
语句,其中发出了数千个快速查询。每次解析和生成查询计划都将成为性能杀手。但是,在极少数情况下,查询可以返回数百万条记录,结果也不适合内存。
有没有办法在PostgreSQL中为预准备语句声明游标?如果没有,是否有任何解决方法?
答案 0 :(得分:0)
https://www.postgresql.org/docs/9.1/static/ecpg-commands.html#ECPG-EXECUTING
这可以通过ECPG C库的c代码完成。 可以用C代码创建准备好的语句,如下:
EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?";
,然后为该语句创建光标为:
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1;
在无限循环内从游标获取结果。
EXEC SQL OPEN foo_bar USING 100;
while(1){
EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname;
}
这在9.1版的postgresql中可用。