如何获取 PostgreSQL 游标的行数?

Posted

技术标签:

【中文标题】如何获取 PostgreSQL 游标的行数?【英文标题】:How to get number of rows of a PostgreSQL cursor? 【发布时间】:2021-02-23 13:56:58 【问题描述】:

我使用WITH HOLD 选项创建了一个游标,该选项允许游标用于后续事务。

我想检索游标可以获取的行数。由于由持有的游标表示的行被复制到临时文件或内存区域中,我想知道是否有可能以直接的方式检索该数字,或者唯一的解决方案是获取所有记录以计算它们。

在这种情况下,MOVE FORWARD ALL FROM <cursor> 语句将返回 MOVE x。其中 x 是 号码移动了。结果是写入标准输出的命令标记,我不知道如何在 pgsql 函数中检索该值。 GET DIAGNOSTICS <var> := ROW_COUNT 仅适用于 FETCH,但不适用于 MOVE

这是一个解决方案,您认为我可以如何改进它? (是否可以使用MOVE 而不是FETCH 来检索x 值?)

-- Function returning the number of rows available in the cursor
CREATE FUNCTION get_cursor_size(_cursor_name TEXT)
    RETURNS TEXT AS
$func$
DECLARE
    _n_rows int;
BEGIN
    -- Set cursor at the end of records
    EXECUTE format('FETCH FORWARD ALL FROM %I', _cursor_name);

    -- Retrieve number of rows
    GET DIAGNOSTICS _n_rows := ROW_COUNT;

    -- Set cursor at the beginning
    EXECUTE format('MOVE ABSOLUTE 0 FROM %I', _cursor_name);
    RETURN _n_rows;
END
$func$ LANGUAGE plpgsql;

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

我不相信在 PL/pgSQL 中有办法做到这一点。

作为一种解决方法,您可以定义游标,使其包含行号:

DECLARE c CURSOR WITH HOLD FOR
SELECT *, row_number() OVER ()
FROM (SELECT /* your original query */) AS s;

这仅比原始查询稍微贵一点,它允许您将光标定位在带有MOVE 的最后一行并检索row_number,这是总行数。

【讨论】:

以上是关于如何获取 PostgreSQL 游标的行数?的主要内容,如果未能解决你的问题,请参考以下文章

如何加快计算 PostgreSQL 表中的行数?

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数

当我已经使用游标时,为啥我得到“精确提取返回的行数超过请求的行数”?

游标的常用属性

选择 Count (distinct col) 查询以显示结果中的行数和列数 - postgresql

text 游标的行数