以下是我在PostgreSQL版本15中存储的过程:

CREATE OR REPLACE PROCEDURE customer_select(OUT customers REFCURSOR)
LANGUAGE plpgsql
AS $$
BEGIN
    OPEN customers FOR
    SELECT * FROM public.customers;
END;
$$;

在这里,我try 调用进程

CALL customer_select('customer_cursor');
FETCH ALL FROM customer_cursor;

但我收到了一个错误

ERROR:  cursor "customer_cursor" does not exist 

我怎么才能让它起作用呢?谢谢

推荐答案

非常接近,我认为主要问题是您使用的是OUT参数,而不是INOUT参数.

你目前拥有的回报类似于:

<unnamed portal 13>

这意味着你必须做fetch all from "<unnamed portal 13>";

您没有为它指定一个名称,而是指定了一个自动生成的名称.您可以从CATALOG(pg_cursors)表中找到它,但最好显式命名它.

如果将参数更改为customers INOUT REFCURSOR,则会得到类似如下的结果:

call customer_select('my_cursor');

> my_cursor

这意味着您可以执行以下操作:

begin;
call customer_select('my_cursor');
fetch all from my_cursor;
commit

Postgresql相关问答推荐

如何在Postgres中对分区表使用Hibernate验证?

在Postgre中的链接服务器上执行远程查询

在Go中从Kafka读取并写入PostgreSQL时如何处理错误?

如何创建一个触发器来传播对主键表的更新?

如何通过 DirectFunctionCall 发送 NULL 参数?

如何防止 PDO 将问号解释为占位符?

PostgreSQL 如何比 SQLite 更快地执行写入?

Postgresql - 在 Big Data 库中使用数组的性能

带有双引号的 postgresql COPY 和 CSV 数据

是否有为 SQL Server 生成完整数据库 DDL 的工具? Postgres 和 MySQL 呢?

Sidekiq - 无法在 5.000 秒内获得数据库连接

安装时 postgres 的默认用户

SQL:多次重复结果行,并对行进行编号

如何启动 Postgres 服务器?

获取 psycopg2 count(*) 结果数

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

pg_restore 会覆盖现有的表吗?

查询 JSON 列中的数组元素

使用 Postgresql 在过滤器中制作 Sqlalchemy 使用日期

处理用户发送的string contains null byte