postgresql中以tablename作为参数的函数

postgresql中以tablename作为参数的函数,postgresql,plpgsql,stored-functions,Postgresql,Plpgsql,Stored Functions,如何在postgresql中创建一个以tablename为参数的函数,该函数返回表的结果集,该结果集作为查询“select*from table”的参数传递。这里的表是传递给函数的参数。您想要的是可能的,但完全没有用 您要求的功能是: CREATE FUNCTION selectall(tbl name) RETURNS SETOF record AS $$ BEGIN RETURN QUERY EXECUTE format('SELECT * FROM %I', tbl); END; $

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

您想要的是可能的,但完全没有用

您要求的功能是:

CREATE FUNCTION selectall(tbl name) RETURNS SETOF record AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT * FROM %I', tbl);
END; 
$$ LANGUAGE plpgsql;
您需要一个集合返回函数(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
您可以将其用作行源,但查询会比简单的
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');
您只能通过指定别名和列定义来使用它:

test=# SELECT * FROM selectall('student') AS t(id int, first_name text, col3 boolean, ...);
现在将其与:

test=# SELECT * FROM student;

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

您要求的功能是:

CREATE FUNCTION selectall(tbl name) RETURNS SETOF record AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT * FROM %I', tbl);
END; 
$$ LANGUAGE plpgsql;
您需要一个集合返回函数(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
您可以将其用作行源,但查询会比简单的
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');
您只能通过指定别名和列定义来使用它:

test=# SELECT * FROM selectall('student') AS t(id int, first_name text, col3 boolean, ...);
现在将其与:

test=# SELECT * FROM student;

参见手册中的示例:你能解释一下你真正想做什么吗?您所描述的类型的函数将是无用且复杂的。@Patrick名为selectall(tablename)的函数。函数执行“select*from tablename”,然后返回结果集。但是为什么
select*from selectall(tablename)作为t(columns…
而不是简单地
select*from tablename
?除非函数中正在进行其他处理,否则它是无用的。告诉我们该处理是什么,你会得到一个好答案。@Patrick如果我创建一个函数作为selectall(),那么就不需要为每个表指定每次“select*from”。所以,如果我创建一个这样的表,那么它很容易,就像只需将表名作为参数传递一样,它只需调用“selectselectall(student);”即可返回表的结果集。请参阅手册中的示例:您能解释一下您真正想要做什么吗?您所描述的类型的函数将是无用且复杂的。@Patrick名为selectall(tablename)的函数。函数执行“select*from tablename”,然后返回结果集。但是为什么
select*from selectall(tablename)作为t(columns…
而不是简单地
select*from tablename
?除非函数中正在进行其他处理,否则它是无用的。告诉我们该处理是什么,你会得到一个好答案。@Patrick如果我创建一个函数作为selectall(),那么就不需要为每个表指定每次“select*from”。所以,如果我创建一个这样的表,那么很容易就可以将表名作为参数传递,然后通过调用“selectall(student);”返回表的结果集