PostgreSQL:为准备好的语句声明一个游标

时间:2018-01-12 16:07:21

标签: sql postgresql cursor prepared-statement

以下DECLARE失败:

PREPARE stmt(bigint) AS SELECT ...;
DECLARE crs CURSOR FOR stmt;

根据https://www.postgresql.org/docs/9.6/static/sql-declare.htmlstmt必须是SELECTVALUES命令。

我在代码的延迟关键部分使用PREPARE语句,其中发出了数千个快速查询。每次解析和生成查询计划都将成为性能杀手。但是,在极少数情况下,查询可以返回数百万条记录,结果也不适合内存。

有没有办法在PostgreSQL中为预准备语句声明游标?如果没有,是否有任何解决方法?

1 个答案:

答案 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中可用。