在返回集合的函数中,RETURN不能带参数;请使用"RETURN NEXT"。出现在"QUERY"附近。 (这是一条与Postgres相关的技术问题)

10
当我尝试编译这个函数时:
CREATE OR REPLACE FUNCTION test_proc4(sr_num bigint) 
    RETURNS TABLE(sr_number bigint, product_serial_number varchar(35))
AS $$
    BEGIN
        RETURN QUERY SELECT select sr_number,product_serial_number from temp_table where sr_number=sr_num
    END;
$$
LANGUAGE 'plpgsql' VOLATILE;

为什么会出现这个错误?

在返回集合的函数中,RETURN 不能带参数;请使用 RETURN NEXT。出错位置在“QUERY”附近。

我正在使用Postgres 8.4版本。

1个回答

12

除了一个打字错误(你重复了 select,并且没有用分号终止RETURN语句)之外,我认为你非常接近成功 - 只需要通过在查询中限定表名来消除歧义。请尝试以下代码(重新格式化以提高可读性):

CREATE OR REPLACE FUNCTION test_proc4(sr_num bigint)
    RETURNS TABLE(sr_number bigint, product_serial_number varchar(35)) AS $$
  BEGIN
    RETURN QUERY
      SELECT
        temp_table.sr_number, temp_table.product_serial_number
      from temp_table
      where temp_table.sr_number=sr_num;
  END;
$$ LANGUAGE 'plpgsql' VOLATILE;

注意:我只在PG 9.4中进行了测试,所以还没有在您的版本中测试过(我要补充的是,您的版本已不再得到支持)。如果您的版本与9.4之间存在PLPGSQL实现方面的问题,您可以尝试使用这种形式作为替代方案:

CREATE OR REPLACE FUNCTION test_proc4(sr_num bigint)
    RETURNS TABLE(sr_number bigint, product_serial_number varchar(35)) AS $$
  BEGIN
    FOR sr_number, product_serial_number IN
      SELECT
        temp_table.sr_number, temp_table.product_serial_number
      from temp_table
      where temp_table.sr_number=sr_num
    LOOP
      RETURN NEXT;
    END LOOP;
    RETURN;
  END;
$$ LANGUAGE 'plpgsql' VOLATILE;

使用我填充虚拟数据的表格进行小型合理性检查:

postgres=# select * from temp_table;
 sr_number | product_serial_number
-----------+-----------------------
         1 | product 1
         2 | product 2
         2 | another product 2
(3 rows)

postgres=# select * from test_proc4(1);
 sr_number | product_serial_number
-----------+-----------------------
         1 | product 1
(1 row)

postgres=# select * from test_proc4(2);
 sr_number | product_serial_number
-----------+-----------------------
         2 | product 2
         2 | another product 2
(2 rows)

1
它给了我同样的错误,“RETURN不能在返回集合的函数中带有参数;在“QUERY”附近使用“RETURN NEXT”。 - user2569524
@user2569524,可能是因为你的PG版本支持或实现PLPGSQL(特别是RETURN QUERY)有所不同。我在我的回答中添加了一种替代形式。 - rchang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接