postgresql 中以表名作为参数的函数

mrg*_*mrg 1 postgresql plpgsql stored-functions

如何在 postgresql 中创建一个以表名作为参数的函数,该函数返回作为查询“select * from TABLE”的参数传递的表的结果集。这里的 TABLE 是传递给函数的参数。

Pat*_*ick 5

你想要的东西是可能的,但完全没有用。

您要求的功能是这样的:

CREATE FUNCTION selectall(tbl name) RETURNS SETOF record AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT * FROM %I', tbl);
END; 
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

您需要一个集合返回函数 (SRF),因为一个表可能有多行。它需要返回,record因为不同的表返回不同的列集。您不能在选择列表中使用此 SRF:

test=# SELECT selectall('student');
ERROR:  set-valued function called in context that cannot accept a set
CONTEXT:  PL/pgSQL function selectall(name) line 3 at RETURN QUERY
Run Code Online (Sandbox Code Playgroud)

您可以将其用作行源,但查询会变得比简单的SELECT * FROM student. 你不能像这样使用它:

test=# SELECT * FROM selectall('student');
ERROR:  a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM selectall('student');
Run Code Online (Sandbox Code Playgroud)

只能通过指定别名和列定义来使用它:

test=# SELECT * FROM selectall('student') AS t(id int, first_name text, col3 boolean, ...);
Run Code Online (Sandbox Code Playgroud)

现在将其与:

test=# SELECT * FROM student;
Run Code Online (Sandbox Code Playgroud)