如何解决如何获取 PostgreSQL 游标的行数?
我使用 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;
非常感谢您的帮助
解决方法
我认为在 PL/pgSQL 中没有办法做到这一点。
作为一种解决方法,您可以定义游标以使其包含行号:
DECLARE c CURSOR WITH HOLD FOR
SELECT *,row_number() OVER ()
FROM (SELECT /* your original query */) AS s;
这只是比原始查询稍微贵一点,并且它允许您使用 MOVE
将光标定位在最后一行并检索 row_number
,即总行数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。