Ash*_*aka 5 postgresql plpgsql database-cursor
我使用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;
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助
我不相信 PL/pgSQL 有办法做到这一点。
作为解决方法,您可以定义游标,使其包含行号:
DECLARE c CURSOR WITH HOLD FOR
SELECT *, row_number() OVER ()
FROM (SELECT /* your original query */) AS s;
Run Code Online (Sandbox Code Playgroud)
这仅比原始查询稍微昂贵一些,并且它允许您将光标定位在最后一行并MOVE检索row_number,即总行数。
| 归档时间: |
|
| 查看次数: |
5748 次 |
| 最近记录: |