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

Sql 当多个函数正在使用复合类型时,如何更改它?,sql,postgresql,function,plpgsql,Sql,Postgresql,Function,Plpgsql,我是PostgreSQL的新手(目前正在使用MSSQL)。假设我们有一个复合类型Customer(uid-uuid,name-text),您可以选择从函数(过程)返回此类型,如: 一切正常,并没有痛苦,但您突然发现客户还需要从数据库返回lastname属性 因此,更改客户类型以添加属性lastname,这就是问题的根源。我发现我可以很容易地将属性添加到Customer类型中,但是使用它的所有函数都会中断,因为它们缺少新添加的属性lastname,并且复合类型属性没有默认值 在这种情况下你们会怎么

我是PostgreSQL的新手(目前正在使用MSSQL)。假设我们有一个复合类型
Customer(uid-uuid,name-text)
,您可以选择从函数(过程)返回此类型,如:

一切正常,并没有痛苦,但您突然发现客户还需要从数据库返回
lastname
属性

因此,更改客户类型以添加属性
lastname
,这就是问题的根源。我发现我可以很容易地将属性添加到
Customer
类型中,但是使用它的所有函数都会中断,因为它们缺少新添加的属性
lastname
,并且复合类型属性没有默认值

在这种情况下你们会怎么做?您是否首先找到使用该类型的所有函数,编写一个查询来替换它们,然后更改该类型并在一次提交中替换所有函数


在MSSQL中没有类型(并且您不必告诉过程必须返回哪种类型),存储过程可以准确地返回您希望它们返回的内容(这有时是个问题)。所以我这里有点空白。

PostgreSQL是严格类型化的环境-它与MSSQL过程有很大区别,在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中的单位是视图,而不是函数


函数对于数据修改、数据检查是必需的,但不应替换视图。有时,当计算过于复杂时,则设置的返回函数很大。但包装简单查询并不是最佳实践

我通常更喜欢
返回表(…)
而不是
我的组合类型集。我只在返回类型需要绑定到公共类型或现有表的情况下使用
SETOF
。例如:

也就是说,一旦你达到了你所处的位置,是的,我会根据复合类型找到所有函数(可能还有其他对象),并在一个事务中更新它们

或者一些客户端(如pgAdmin)根据对象列出

CREATE OR REPLACE FUNCTION fx()
RETURNS REFCURSOR AS $$
DECLARE refc refcursor;
BEGIN
  OPEN refc FOR SELECT ...;
  RETURN refc;
END;
$$ LANGUAGE plpgsql;