gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:56:18 25 4
gpt4 key购买 nike

我是 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 中没有类型(并且您不需要告诉过程必须返回哪种类型),存储过程可以准确地返回您想要它们返回的类型(这有时是个问题)。所以我在这里有点空白。

最佳答案

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 是类似的)说 - 不要用过程/函数包装简单的查询。 改用 View 。它不会破坏查询优化的空间,您不需要解决您的问题。

SQL 中的单位是 View ,而不是函数。

函数对于数据修改、数据检查是必需的——但不应该取代 View 。有时,当计算过于复杂时,SET RETURNING FUNCTIONS 就很棒了。但是包装简单的查询并不是最佳实践。

关于sql - 当多个函数使用它时如何改变复合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42520127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com