我有一个名为“ 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 运行。但是,在上述示例中我无法使它起作用。
答案 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)