【问题标题】:In postgres (plpgsql), how to make a function that returns select * on a variable table_name?在 postgres (plpgsql) 中,如何创建一个在变量 table_name 上返回 select * 的函数?
【发布时间】:2011-07-24 12:46:21
【问题描述】:

基本上,至少为了概念验证,我想要一个可以运行的函数: 选择 res('table_name');这会给我 SELECT * FROM table_name; 的结果。 我遇到的问题是架构......在我拥有的函数声明中:

CREATE OR REPLACE FUNCTION res(table_name TEXT) RETURNS SETOF THISISTHEPROBLEM AS

问题是我不知道如何声明我的返回,因为它要我指定一个表或模式,并且在函数实际运行之前我不会拥有它。

有什么想法吗?

【问题讨论】:

标签: postgresql plpgsql


【解决方案1】:

您可以这样做,但如前所述,您必须在 SELECT 查询中添加列定义列表。

CREATE OR REPLACE FUNCTION res(table_name TEXT)  RETURNS SETOF record AS $$
BEGIN
  RETURN QUERY EXECUTE 'SELECT * FROM ' || table_name;
END;
$$ LANGUAGE plpgsql;


SELECT * FROM res('sometable') sometable (col1 INTEGER, col2 INTEGER, col3 SMALLINT, col4 TEXT);

【讨论】:

  • +1 有用的答案。值得一提的是return query execute是8.4及以上?
【解决方案2】:

为什么出于任何实际的实际目的,您只想传入 table 并从中选择 *?也许是为了好玩?

如果不定义某种已知输出,例如 jack 和 rudi show,您将无法做到这一点。或者像 depesz 在这里使用输出参数 http://www.depesz.com/index.php/2008/05/03/waiting-for-84-return-query-execute-and-cursor_tuple_fraction/ 那样做。

一些绕墙的方法是在循环中发出引发通知并一次打印出一行结果集。或者,您可以创建一个名为 get_rows_TABLENAME 的函数,该函数对您要返回的每个表都有一个定义。只需使用代码来生成程序创建。但是再次不确定从表中选择 * 有多少价值,尤其是在没有限制的情况下,除了为了好玩或让 DBA 热血沸腾。

现在在 SQL Server 中,您可以让存储过程返回动态结果集。这既是祝福也是诅咒,因为如果不查看定义,您无法确定会发生什么。对我来说,我认为 PostgreSQL 的实现是更合理的方式。

【讨论】:

  • depesz 网站是一个非常棒的资源,如果您从未检查过的话。他有很多例子和测试。
  • 我想我一开始就被狡猾的英语吓到了 - 但你是对的 - 这是一个信息矿。 wCTE?哇。
【解决方案3】:

即使您设法做到这一点(如果您有 8.4 或更高版本,请参阅 rudi-moore 的答案),您也必须在 select 中显式扩展类型 - 例如:

SELECT res('table_name') as foo(id int,...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多