【问题标题】:Return ResultSet in pgsql function在 pgsql 函数中返回 ResultSet
【发布时间】:2014-03-09 03:58:45
【问题描述】:

我有下面的功能……

CREATE OR REPLACE FUNCTION class_listing(var_sem integer, var_sy character) RETURNS SETOF RECORD AS
DECLARE
    current_offering record;

BEGIN
    SELECT subcode, offerno INTO current_offering FROM offering WHERE SY=var_sem AND SEM=var_sy;

END;

如何将current_offering 作为结果集返回?

【问题讨论】:

    标签: postgresql stored-procedures plpgsql


    【解决方案1】:

    您可以使用 SQL 或 PLpgSQL 函数。使用匿名记录作为返回类型是不切实际的(主要是它不友好,当您编写查询时)。请改用 RETURNS TABLE 或 OUT 参数。

    CREATE OR REPLACE FUNCTION class_listing(var_sem integer, var_sy varchar)
    RETURNS TABLE (subcode varchar, offerno int) AS $$
    BEGIN
      RETURN QUERY SELECT o.subcode, o.offerno
                      FROM offering 
                     WHERE SY=var_sem AND SEM=var_sy;
    END;
    $$ LANGUAGE plpgsql;
    

    或 SQL 语言

    CREATE OR REPLACE FUNCTION class_listing(var_sem integer, var_sy varchar)
    RETURNS TABLE (subcode varchar, offerno int) AS $$
      SELECT o.subcode, o.offerno
                      FROM offering 
                     WHERE SY=$1 AND SEM=$2;
    $$ LANGUAGE sql;
    

    注意 - 基于查询的函数(除了少数例外)可作为优化器屏障。所以在复杂查询中使用它时要小心。

    为了完整性 - 你的例子可以写成:

    CREATE OR REPLACE FUNCTION class_listing(var_sem integer, var_sy varchar)
    RETURNS SETOF RECORD AS $$
    DECLARE current_offering record;
    BEGIN
      FOR current_offering IN 
              SELECT o.subcode, o.offerno
                 FROM offering 
                WHERE SY=var_sem AND SEM=var_sy;
      LOOP
        RETURN NEXT current_offering;
      END LOOP;
      RETURN;
    END;
    $$ LANGUAGE plpgsql;
    

    但是这种形式现在已经被弃用了

    【讨论】:

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