在PL / pgSQL函数中返回动态SQL语句

时间:2019-12-10 19:49:05

标签: sql postgresql function dynamic plpgsql

我有一个名为“ points”的表,该表的几何类型为“ geom”。 我想创建一个返回带有“ geometry”数据类型列的表的函数。在“ 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 运行。但是,在上述示例中我无法使它起作用。

1 个答案:

答案 0 :(得分: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)