当多个函数使用它时如何更改复合类型?

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,其中返回类型需要绑定到通用类型或现有表。示例:

Return setof record (virtual table) from function

也就是说,一旦你站在你的立场上,是的,我会根据复合类型找到所有函数(可能还有其他对象),并在单个事务中更新所有函数。

How to check which function uses a type?

或某些客户端(如 pgAdmin)列出依赖对象。

【讨论】:

以上是关于当多个函数使用它时如何更改复合类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用多个复合输出参数调用 PostgreSQL 函数

PL/SQL复合变量

在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?

hive复合数据类型array

如何在 postgreSQL 中处理复合类型的变化

如何修复元素类型无效:期望字符串(用于内置组件)或类/函数(用于复合组件)但得到:对象