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

标签 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.html , stmt 必须是 SELECTVALUES 命令。

我在代码的延迟关键部分使用了 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/

相关文章:

c# - 使用 C# 将 PDF 作为字节数组插入 SQL Server 存储过程

mysql - 在 MySQL 中创建虚拟表

sql - Go 没有参数 $1

oracle - "Cursor is closed"错误 - 尝试使用 JDBC 执行 Oracle SP 时

mysql - 使用循环和游标对 MySQL 表中的所有行进行编号

php - 有没有办法将选定的属性组合到返回的 Laravel 模型中的特定属性中?

mysql - 分组时的问题

sql - 在 Postgresql 中加入最大记录

php - 连接 PHP 和 postgreSQL8.3

android - 将标题添加到android中的简单游标适配器数据