2012-02-06 86 views
0

是否可以为某些PostgreSQL函数定义任意返回类型?是否有可能让PostgreSQL函数返回“任意”类型?

想法是,根据调用,输出可能会以不同的方式返回。

例如,假设我们有:

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

我们可以有一个函数:

func1(name varchar); 

但返回类型可能是两种:TypeATypeB

那么,是不是可以定义func1,这样任意返回类型的作品?

编辑:

如果溶液REFCURSOR ......可能有人请写一个基于我的问题的例子的答案吗?这会有很大的帮助!

+0

返回一个refcursor? – Glenn 2012-02-06 15:42:19

+0

格伦,谢谢,但请您举个小例子。这将非常有帮助。 – Larry 2012-02-06 15:55:20

+2

http://www.postgresql.org/docs/8.1/static/plpgsql-cursors.html底部有一些例子。可能不是你正在寻找的东西,但它是一种可能的技术。 – Glenn 2012-02-06 16:05:23

回答

1

您有几个选项。首先是使用一个多态类型,这个类型可以在调用时投出,第二个是使用强制转换,第三个是返回refcursor。

多态型

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

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

然后调用它,你会投上调用NULL参数:

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

你有这个问题的真正问题是,你将不得不在每次通话中指定一个类型。

与演员

在你的榜样单返回类型,一个类型有另一种类型的字段的子集。所以,你可以:

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; 

请注意,这两个允许您使用refcursors没有的SQL语言函数。

REFCURSOR

在这种情况下,你必须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可能是第二种方法。最后会坚持一个类型的演员阵容。

相关问题