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