将表传递给 postgreSQL 函数,执行 select 语句,返回表

Posted

技术标签:

【中文标题】将表传递给 postgreSQL 函数,执行 select 语句,返回表【英文标题】:Pass table to postgreSQL function, execute select statement, return table 【发布时间】:2016-06-15 02:30:04 【问题描述】:

我正在从 MSSQL 过渡到 postgreSQL,并且仍在研究过程编程的语法。想法是创建一个函数,将表作为输入/参数,针对该输入表执行一系列 SELECT 语句(没有临时表;SELECT 语句将使用 CTE 执行),以及 @987654323 @决赛桌。

输入表会非常简单:

Col_1      Col_2       Col_3
----------------------------
2           5           12  

我想使用输入表中的每个字段来计算一个数字(在此示例中,求和 Col_1Col_2Col_3),将其附加到输入表中,并创建一个输出显示为这样的表:

Col 1      Col_2       Col_3      Col_4
---------------------------------------
2           5           12        19   

我对代码的尝试:

CREATE OR REPLACE FUNCTION summing_function(input_table)
RETURNS output_table(Col_1 INT, Col_2 INT, Col_3 INT, Col_4 INT) AS
$$
SELECT 
    i.*
    , i."Col_1" + i."Col_2" + i."Col_3" as sum
INTO output_table
FROM input_table i
$$
LANGUAGE SQL;

显然美元引号之间的所有内容都是不完整/错误的。美元引号之间的片断的正确 postgreSQL 语法是什么?

【问题讨论】:

不是您想使用的视图吗? (这个问题并不是说您应该使用视图,而是我提出的一个真正的问题,以了解为什么视图不能成为此处使用的正确工具) 视图很可能是更好的解决方案。我只是想澄清一下一般的 postgreSQL 语法和约束。 【参考方案1】:

您不能将“表”作为函数参数传递。您可以将表的名称传递给 PL/pgSQL 函数,然后运行 ​​dynamic query:

CREATE OR REPLACE FUNCTION summing_function(input_table text)
    RETURNS TABLE (col_1 int, col_2 int, col_3 int, col_4 int) AS $$
BEGIN
    RETURN QUERY EXECUTE
        format('SELECT *, col_1 + col_2 + col_3 FROM %I', input_table);
END;
$$ LANGUAGE plpgsql;

【讨论】:

以上是关于将表传递给 postgreSQL 函数,执行 select 语句,返回表的主要内容,如果未能解决你的问题,请参考以下文章

将数组传递给 PostgreSQL PL/pgSQL 函数

如何将表行传递给 plpgsql 函数?

SQL Server - 将表传递给函数......如何?这是个好主意吗?

将表 rrecordset 传递给 SQL Server

每个将表名传递给过程的 ORACLE PL/SQL

将数组文字传递给 PostgreSQL 函数