PostgreSQL 错误:RETURN NEXT 不能在带有 OUT 参数的函数中包含参数

Nil*_*Nil 2 postgresql plpgsql

我在 PostgreSQL 9.2 中有一个 plpgsql 函数,它返回一个表。我尝试找到数据库中的点对之间的距离。但我面临这个问题标题中的错误。

我想做这样的事情:

CREATE OR REPLACE FUNCTION max_dis(which_tab text)
RETURNS TABLE(P1 geometry, P2 geometry, dis double precision) as

$$
DECLARE
   my_row RECORD;
   my_row2 RECORD;

BEGIN

    FOR my_row IN EXECUTE ('SELECT * FROM '||which_tab) LOOP
         -- 
       FOR my_row2 IN EXECUTE ('SELECT * FROM '||which_tab) LOOP

        SELECT ST_DISTANCE(my_row.the_geom, my_row2.the_geom) 

        INTO dis;

            RETURN NEXT my_row,my_row2; 

        END LOOP;

    END LOOP;

    RETURN;

END ;

$$
LANGUAGE plpgsql VOLATILE STRICT; 
Run Code Online (Sandbox Code Playgroud)

Pav*_*ule 5

当您使用表函数时 - 带有声明 RETURNS TABLE (),则输出表的任何列都有一个隐式变量。在这种情况下,RETURN NEXT 不带参数使用,因为返回值是由参数变量的内容组成的。

CREATE OR REPLACE FUNCTION xx()
RETURNS TABLE(a int, b int) AS $$
BEGIN
   a := 1;
   b := 2;
   RETURN NEXT;
   b := 3;
   RETURN NEXT;
   RETURN;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

但是您可以通过 RETURN QUERY 语句增强您的功能

BEGIN
  RETURN QUERY EXECUTE format('SELECT t1.the_geom, t2.the_geom,
                                      ST_DISTANCE(t1.the_geom, t2.geom)
                                  FROM %I t1, %I t2', which_tab, which_tab);
  RETURN;
END;
Run Code Online (Sandbox Code Playgroud)