gpt4 book ai didi

sql - 是否可以让 PostgreSQL 函数返回 “arbitrary” 类型?

转载 作者:行者123 更新时间:2023-11-29 14:24:04 27 4
gpt4 key购买 nike

是否可以为某些 PostgreSQL 函数定义任意返回类型?

这个想法是,根据调用的不同,可能会返回不同的输出。

例如,假设我们有:

TypeA : (name, email)
TypeB : (name, email, address, phone)

我们可能有一个函数:

func1(name varchar);

但返回类型可以是:TypeATypeB

那么,是否可以定义 func1,以便任意返回类型起作用?

编辑:

如果解决方案是refcursor ...有人可以根据我问题中的示例写一个答案吗?那会有很大帮助!

最佳答案

您有几个选择。第一种是使用将在调用时强制转换的多态类型,第二种是使用强制转换,第三种是返回一个 refcursor。

多态类型

在这种情况下,你会做类似的事情:

 CREATE FUNCTION foo (bar varchar, baz ANYELEMENT) returns ANYELEMENT AS
$$
SELECT 'test'::TEXT;
$$ language sql;

然后要调用它,您将在调用时转换 NULL 参数:

SELECT * FROM foo('test', null::varchar);

真正的问题是您必须在每次调用时指定一个类型。

带 Cast 的单一返回类型

在您的示例中,一种类型具有另一种类型的字段子集。所以你可以:

CREATE TYPE all_info AS (
name text,
email text,
address text,
phone text
);
CREATE TYPE email_only AS (
name text,
email text
);
CREATE FUNCTION email_only(all_info) returns email_only LANGUAGE SQL IMMUTABLE AS $$
SELECT $1.name, $1.email;
$$;
CREATE CAST (all_info as email_only) WITH FUNCTION email_only(all_info);

然后你创建你的函数来返回 all_info 并且你可以对输出进行强制转换。像这样的东西:

SELECT (f::email_only).* FROM my_function('foo') f;

请注意,这两个允许您使用 SQL 语言函数,而 refcursors 则不能。

引用者

在这种情况下你必须使用plpgsql

CREATE OR REPLACE FUNCTION foo(bar varchar) RETURNS refcursor LANGUAGE plpgsql AS
$$
DECLARE a REFCURSOR;
BEGIN
OPEN a FOR SELECT ....;
RETURN a;
END;
$$;

总的来说,我认为从超集和转换方法开始比其他方法更容易。 Refcursors 可能是第二种方法。最后是坚持对类型进行强制转换。

关于sql - 是否可以让 PostgreSQL 函数返回 “arbitrary” 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162529/

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