函数根据其他函数的返回数据返回表

时间:2016-03-17 08:59:10

标签: postgresql stored-procedures postgresql-9.4

我的函数定义为:

CREATE OR REPLACE FUNCTION func_1() RETURNS TABLE (
    column_1 text,
    column_2 text,
    -- large number of other returned columns
    -- ...
) AS
$$
BEGIN
    -- Something done here
END;
$$
LANGUAGE plpgsql;

是否可以声明func_2,它将使用与func_1相同的返回表结构(func_1返回的数据将由func_2在内部使用)?

当然,我基本上可以复制并粘贴声明,但是如果从func_1返回的表结构发生任何变化,我必须手动保持func_2同步。一种方法是重构func_1以返回复合类型并使func_2返回相同的类型 - 但是是否可以继续使用RETURNS TABLE并使另一个函数依赖于它“无缝地”?

1 个答案:

答案 0 :(得分:0)

正如@Joshua上面指出的那样,你可以通过利用每个表和视图都带有一个自由复合类型这一事实来设置这些函数之间的依赖关系:

CREATE FUNCTION f() RETURNS TABLE (x INT) LANGUAGE sql AS 'VALUES (1)';
CREATE VIEW v AS SELECT * FROM f();
CREATE FUNCTION g() RETURNS SETOF v LANGUAGE sql AS 'VALUES (2)';

g()现在取决于f()的返回类型。虽然如果你希望改变f()的返回类型并让它传播,你就不幸了:

CREATE OR REPLACE FUNCTION f() RETURNS TABLE (x INT, y INT) LANGUAGE sql AS 'VALUES (3,3)';
  

错误:无法更改现有功能的返回类型

     

提示:首先使用DROP FUNCTION f()。

然后,当然:

DROP FUNCTION f();
  

错误:不能删除函数f(),因为其他对象依赖于它

     

详细信息:视图v取决于函数f()

     

函数g()取决于类型v

     

提示:使用DROP ... CASCADE也可以删除相关对象。

如果你想重新定义函数返回而不完全删除它,我认为你需要创建一个复合类型。