1

我正在寻找返回表的 PostgreSQL 函数的帮助。我想知道是否有办法更新正在返回的表。

这是一个例子,

create or replace function fn_function()
return table(column01 integer, column02 integer, column03 boolean) as $$
    return query
    select col1, col2, false
    from tableXYZ;


    /* how can i update the table, let's say column03 before the function exits */

end
$$ language plpgsql;

我可以给要返回的表一个别名吗?

使用的 postgre 版本是 9.0.8。

提前谢谢。

4

3 回答 3

0

要从表中选择,修改 select 的结果并将它们作为函数的结果传递,尝试类似:

create or replace function fn_function()
returns table (
    column01 integer, column02 integer, column03 boolean
) as $$
begin
    for rec in select col1, col2, false as col3
               from tableXYZ;
    loop
      rec.col3 := col1 > col2;

      return next rec;
    end loop;
    return; 
end
$$ language plpgsql;

详情here

选择简单地得到这个函数的结果

SELECT function_alias.col1, function_alias.col2 
FROM fn_function() function_alias;

您可以使用此功能执行与普通表相同的操作。

于 2013-05-23T16:37:08.850 回答
0

只需执行一个返回您想要的值的查询。它可以是普通的 sql:

create or replace function fn_function()
returns table (
    column01 integer, column02 integer, column03 boolean
) as $$

    select col1, col2, col2 > 10
    from tableXYZ;

$$ language sql;

在上面的示例中,如果 col2 > 10,第 3 列将为真,否则为假。另一个使用子选择的例子:

create or replace function fn_function()
returns table (
    column01 integer, column02 integer, column03 boolean
) as $$

    select col1, col2, (select max(col1) > 10 from t where col2 = tableXYZ.col1)
    from tableXYZ;

$$ language sql;

注意不是return但是returns

于 2013-05-23T16:09:50.250 回答
0

这是一个基于集合的解决方案。

RETURNS TABLE 只是获取数据的门户,您无法在定义它的函数内执行任何操作。您可以创建另一个函数并调用它并对结果集执行操作。但是,我使用临时表,因此您可以在发送数据之前对其进行操作。

CREATE OR REPLACE FUNCTION fn_function()
    RETURNS TABLE(column01 integer, column02 integer, column03 boolean) AS $$
    BEGIN

      CREATE TEMP TABLE temp_tableXYZ (column01 integer, column02 integer, column03 boolean) ON COMMIT DROP;

     INSERT INTO temp_tableXYZ (column01, column02, column03)
     SELECT col1,col2,col3
     FROM tableXYZ;
     --WHERE filter if you can.

      UPDATE temp_tableXYZ
      SET col1 = 9999;

      RETURN QUERY select column01, column02, column03 from temp_tableXYZ;
    END;
    $$ LANGUAGE plpgsql;

您可以使用这样的别名来调用它:

SELECT * FROM fn_function() as my_table;
于 2013-05-23T15:34:20.593 回答