当多个函数使用它时如何更改复合类型?
Posted
技术标签:
【中文标题】当多个函数使用它时如何更改复合类型?【英文标题】:How to alter a composite type when multiple functions are using it? 【发布时间】:2017-02-28 22:43:19 【问题描述】:我是 PostgreSQL 新手(目前正在使用 MSSQL)。假设我们有一个复合类型 Customer(uid uuid, name text)
,并且您选择从您的函数(过程)中返回此类型,例如:
create or replace function public.getCustomers(value text)
returns setof Customer as
$$
select "uid", "name", from "Common_Customer";
$$
language sql;
一切正常,没有痛苦,但突然你发现客户还需要从数据库返回一个lastname
属性。
因此,您更改客户类型以添加属性lastname
,这就是麻烦开始的地方。我发现我可以轻松地将属性添加到 Customer
类型,但是使用它的所有函数都会中断,因为它们缺少新添加的属性 lastname
并且复合类型属性没有默认值。
你们遇到这种情况怎么办?您是否首先找到使用该类型的所有函数,编写查询以替换它们,然后在一次提交中更改类型并替换所有函数?
在 MSSQL 中没有类型(并且您不必告诉过程必须返回哪种类型),存储过程可以准确地返回您想要的类型(这有时是个问题)。所以我这里有点空白。
【问题讨论】:
【参考方案1】:PostgreSQL 是严格类型化的环境——它与 MSSQL 过程有很大的不同,你可以返回任何东西。部分可以用游标解决。您可以编写返回游标的函数 - 游标是动态的。
CREATE OR REPLACE FUNCTION fx()
RETURNS REFCURSOR AS $$
DECLARE refc refcursor;
BEGIN
OPEN refc FOR SELECT ...;
RETURN refc;
END;
$$ LANGUAGE plpgsql;
但只有在从 MSSQL 1:1 迁移时才应使用此技术。
PostgreSQL 的最佳实践(Oracle 类似)说 - 不要用过程/函数包装简单的查询。 改用视图。它不会破坏查询优化的空间,并且您不需要解决您的问题。
SQL 中的单元是视图,而不是函数。
函数是数据修改、数据检查所必需的——但不应取代视图。有时,当计算过于复杂时,SET RETURNING FUNCTIONS 就很棒。但是包装简单查询并不是最佳实践。
【讨论】:
【参考方案2】:我通常更喜欢RETURNS TABLE(...)
而不是SETOF my_composite_type
。我只使用SETOF
,其中返回类型需要绑定到通用类型或现有表。示例:
也就是说,一旦你站在你的立场上,是的,我会根据复合类型找到所有函数(可能还有其他对象),并在单个事务中更新所有函数。
How to check which function uses a type?或某些客户端(如 pgAdmin)列出依赖对象。
【讨论】:
以上是关于当多个函数使用它时如何更改复合类型?的主要内容,如果未能解决你的问题,请参考以下文章