【问题标题】:How to select all rows from refcursor returned by PL/pgSQL function?如何从 PL/pgSQL 函数返回的 refcursor 中选择所有行?
【发布时间】:2014-05-13 17:27:15
【问题描述】:

我有一个返回 refcursor 的函数 some_func():

CREATE OR REPLACE FUNCTION some_func() RETURNS refcursor AS (...)

我想从控制台调用这个函数并从它返回的光标显示结果集。在甲骨文我会写:

SELECT * FROM TABLE(some_func());

在 PosgreSQL 上该构造的等价物是什么?

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    一个 refcursor 是由它的名字来引用的,要么是自动生成的,要么是你选择的。 这个page of the doc 给出了每个例子。

    要从 refcursor 获取结果,您必须具有游标的名称。如果生成的名称类似于<unnamed portal 1>"。然后你可以:

    FETCH ALL FROM "<unnamed portal 1>";
    

    游标名称作为refcursor结果从函数返回,所以你可以从那里得到它。

    【讨论】:

    • 是的,但是由于没有定义游标的名称,所以我不知道,也无法做到……
    • 仅当您使用自动生成的名称时。请参阅调用者指定固定名称的文档的第一个示例。
    • 嗯,程序的作者没有指定固定名称是事实。所以我正在寻找通用解决方案。
    • 一般来说,对于select * from func() 的PG,人们会使用一个返回SETOF something 的函数而不是一个refcursor。目前尚不清楚您是否坚持使用已使用 refcurs 的现有设计,或者您是否处于设计阶段,在这种情况下,您可能需要重新考虑支持 SETOF。
    • 在这个线程中检查我的答案:stackoverflow.com/a/12483222/657174我认为这种方法更容易使用。
    【解决方案2】:

    假设你有一个 postgres 函数以返回一个引用的方式编写;

    CREATE OR REPLACE FUNCTION "com.mkindika"."myfunction" ("refcursor", other input  parameters) RETURNS "pg_catalog"."refcursor" AS 
    $body$
    DECLARE
    
    ---- query
    
    END;
    $body$
    LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER;
    

    如果你想打印 refcursor,你可以使用以下代码行;

    BEGIN;
    SELECT "com.mkindika"."myfunction" ("refcursor",other input parameters);
    FETCH ALL IN "refcursor";
    

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多