您有几个选项。首先是使用一个多态类型,这个类型可以在调用时投出,第二个是使用强制转换,第三个是返回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可能是第二种方法。最后会坚持一个类型的演员阵容。
返回一个refcursor? – Glenn 2012-02-06 15:42:19
格伦,谢谢,但请您举个小例子。这将非常有帮助。 – Larry 2012-02-06 15:55:20
http://www.postgresql.org/docs/8.1/static/plpgsql-cursors.html底部有一些例子。可能不是你正在寻找的东西,但它是一种可能的技术。 – Glenn 2012-02-06 16:05:23