以下 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
语句,其中发出了数千个快速查询。每次解析和生成查询计划将是性能 killer 。但是,在极少数情况下,查询可能会返回数百万条记录,而结果无法放入内存。
有没有办法在 PostgreSQL 中为准备好的语句声明一个游标?如果没有,是否有任何解决方法?
最佳答案
https://www.postgresql.org/docs/9.1/static/ecpg-commands.html#ECPG-EXECUTING
这可以通过 C 代码中的 ECPG 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 中可用。
关于sql - PostgreSQL:为准备好的语句声明一个游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229961/