0

我有一个名为“points”的表,其中有一列名为“geom”的几何类型。我想创建一个函数,该函数返回一个包含“几何”数据类型列的表。当目标表(点)的名称在“RETURN QUERY”子句中硬编码时,我已成功返回具有正确数据类型的表。我想将表的名称作为函数的输入(以动态方式)。如何更改此代码以接受目标表的名称(在此代码中称为点)作为输入?

CREATE OR REPLACE FUNCTION milad_points()
RETURNS TABLE (geom points.geom%TYPE)
AS $$ 
BEGIN
RETURN QUERY SELECT points.geom FROM points;
END;
$$ LANGUAGE PLPGSQL;

我知道为了管理动态查询,我们必须将其作为字符串并将其作为EXECUTE sql_string运行。但是,我无法在上述示例中使用它。

4

1 回答 1

0

这样做的唯一方法是使用anyelement数据类型。但是为了anyelement用作返回类型,您也必须指定一个anyelement参数。使用什么值作为参数并不重要,但它的数据类型决定了返回的实际数据类型。

请参见以下示例:

CREATE FUNCTION anyfun(tabname name, typdef anyelement) RETURNS SETOF anyelement
   LANGUAGE plpgsql STABLE AS
$$BEGIN
   RETURN QUERY EXECUTE format('SELECT id FROM %I', tabname);
END;$$;

现在让我们用两个不同的表来测试它:

CREATE TABLE anytab (id integer);
INSERT INTO anytab VALUES (1), (42);

SELECT * FROM anyfun('anytab', NULL::integer);

 anyfun 
--------
      1
     42
(2 rows)

CREATE TABLE anothertab (id text);
INSERT INTO anothertab VALUES ('one'), ('two');

SELECT * FROM anyfun('anothertab', NULL::text);

 anyfun 
--------
 one
 two
(2 rows)
于 2019-12-10T20:48:36.760 回答