【问题标题】:Functions with tablename as argument in postgresqlpostgresql 中以表名作为参数的函数
【发布时间】:2016-01-25 06:58:06
【问题描述】:

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

【问题讨论】:

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

标签: postgresql plpgsql stored-functions


【解决方案1】:

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

你要求的功能是这样的:

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;

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2021-07-30
    • 2011-12-18
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多