Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PL/pgSQL函数中返回动态SQL语句_Sql_Postgresql_Function_Dynamic_Plpgsql - Fatal编程技术网

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

在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

我有一个名为“points”的表格,其中有一列名为“geom”,类型为geometry。 我想创建一个函数,返回一个数据类型为“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;

我知道,为了管理动态查询,我们必须将其设置为字符串,并将其作为执行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_字符串”。我认为它提供了广泛的灵活性,肯定会解决我的问题。