【问题标题】:Calling a function that returns a refcursor调用返回引用的函数
【发布时间】:2011-10-04 05:23:42
【问题描述】:

我正在使用 Postgresql 8.3 并具有以下简单函数,它将向客户端返回 refcursor

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR;
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;

现在,我可以使用以下 SQL 命令来调用这个函数并操作返回的游标,但是游标名称是由 PostgreSQL 自动生成的

BEGIN;
SELECT function_1();  --It will output the generated cursor name , for example , "<unnamed portal 11>" ;
FETCH 4   from  "<unnamed portal 11>"; 
COMMIT;

除了像38.7.3.5. Returning Cursors 描述的那样显式声明游标名称作为函数的输入参数之外,我是否可以声明自己的游标名称并使用该游标名称来操作返回的游标,而不是 Postgresql 自动为我生成?

如果没有,有什么命令可以获取生成的游标名吗?

【问题讨论】:

    标签: sql postgresql plpgsql database-cursor ref-cursor


    【解决方案1】:

    我不太确定从哪个版本的 Postgre 中可以使用(在 8.4 中它是有效的),但我发现在声明游标名称时定义它非常容易,如下所示:

    CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
    DECLARE
            ref_cursor REFCURSOR := 'mycursor';
    BEGIN
            OPEN ref_cursor FOR SELECT * FROM some_table;
            RETURN (ref_cursor);    
    END;
    $$ LANGUAGE plpgsql;
    

    然后你可以这样得到它:

    BEGIN;
    SELECT function_1();
    FETCH 4   from  mycursor; 
    COMMIT;
    

    我发现这种方法不太麻烦。 希望对您有所帮助。

    【讨论】:

    • 感谢您的解决方案。它在 8.3.12 中也可用
    【解决方案2】:

    是的,使用:

    CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$
    BEGIN
            OPEN $1 FOR SELECT * FROM some_table;
            RETURN $1;    
    END;
    $$ LANGUAGE plpgsql;
    

    结果:

    SELECT function_1('myowncursorname');
       function_1
    -----------------
     myowncursorname
    (1 row)
    

    看起来自动生成的名称是&lt;unnamed portal n&gt;,其中n 是自然数(从1 开始)。

    编辑:

    作为另一种方式,您可以使用 pg_cursors 视图和此类查询来获取生成的游标名称:

    SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
    

    例如:

    BEGIN;
    SELECT function_1();
    SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
    COMMIT;
    

    结果:

         function_1
    --------------------
     <unnamed portal 3>
    (1 row)
    
            name
    --------------------
     <unnamed portal 3>
    (1 row)
    

    【讨论】:

    • 谢谢。但问题是function_1是其他方提供的,我无法更改此函数的输入参数。
    • 我认为这是提供自定义光标名称的唯一方法,但我不能 100% 确定这一点。
    • @Ken:从pg_cursors系统目录(如上)中获取游标的名称怎么样?
    • 很好的尝试,谢谢!它可以从pg_cursors视图中获取游标名称。但是我的statement太长了,所以我使用pg_cursors中最新的creation_time来获取游标名称
    猜你喜欢
    • 2022-11-24
    • 2015-05-05
    • 2014-05-15
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多