在PL/pgSQL函数中返回动态SQL语句
我有一个名为“points”的表格,其中有一列名为“geom”,类型为geometry。 我想创建一个函数,返回一个数据类型为“geometry”的列的表。当目标表(点)的名称硬编码在“RETURN QUERY”子句中时,我成功地返回了具有正确数据类型的表。 我希望将表的名称作为函数的输入(以动态方式)。如何更改此代码以接受目标表的名称(在此代码中称为点)作为输入在PL/pgSQL函数中返回动态SQL语句,sql,postgresql,function,dynamic,plpgsql,Sql,Postgresql,Function,Dynamic,Plpgsql,我有一个名为“points”的表格,其中有一列名为“geom”,类型为geometry。 我想创建一个函数,返回一个数据类型为“geometry”的列的表。当目标表(点)的名称硬编码在“RETURN QUERY”子句中时,我成功地返回了具有正确数据类型的表。 我希望将表的名称作为函数的输入(以动态方式)。如何更改此代码以接受目标表的名称(在此代码中称为点)作为输入 CREATE OR REPLACE FUNCTION milad_points() RETURNS TABLE (geom poin
CREATE OR REPLACE FUNCTION milad_points()
RETURNS TABLE (geom points.geom%TYPE)
AS $$
BEGIN
RETURN QUERY SELECT points.geom FROM points;
END;
$$ LANGUAGE PLPGSQL;
我知道,为了管理动态查询,我们必须将其设置为字符串,并将其作为执行sql\u字符串运行。但是,在上述示例中,我无法使其工作。这样做的唯一方法是使用
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)
谢谢Laurenz,我不知道我们可以使用“返回查询执行+sql_字符串”。我认为它提供了广泛的灵活性,肯定会解决我的问题。