基本的东西,如在C数据类型中,存在于所有流行的语言中,并且预期这些语言的函数也可以返回一个结构.并且,根据正交原理,您可以访问返回的结构itens。
然而,PostgreSQL没有提供对FUNCTION ... RETURNS RECORD结构的访问。是对的吗?
但是程序员使用PostgreSQL时没有抱怨..。有一个简单直观的解决方法?
类似问题:PostgreSQL v9.X有真正的“记录数组”吗?
用典型案例说明
CREATE FUNCTION foo(int) RETURNS RECORD AS $$
SELECT $1 as a, 'Hello #'||$1 as b;
$$ LANGUAGE SQL;
SELECT foo(6); -- works, but I need only one item在SQL上下文中访问记录项
SELECT (foo(6)).a; -- NOT works (but no ambiguity!)
-- For syntax discussion:
WITH f AS (SELECT foo(6) as r) SELECT r.a FROM f; -- NOT works
-- ambiguous syntax; confused r with table, in "f.r.a", f with schema
-- perhaps r['a'] would be a good syntax solution在PLpgSQL上下文中访问记录itens
怎么说x:=(foo(6)).a或y:=foo(6); x:=y.a?现在,在PLpgSQL中有一些预期的行为,至少允许“命名记录”:
CREATE FUNCTION bar() RETURNS text AS $F$
DECLARE
tmp record;
s text;
BEGIN
-- s:=(foo(7)).b; NOT WORKS, is like an "anonymous record" (not permitted)
tmp := foo(6);
s:=tmp.b; -- IT WORKS!! is like a "named record" (permitted)
RETURN s||'! '||tmp.a; -- ...works accessing any other individual itens
END;
$F$ LANGUAGE plpgsql IMMUTABLE;发布于 2014-05-03 11:53:31
如果您使用更灵活的returns table而不是(有些过时的) returns record,那么事情就变得非常容易了:
CREATE FUNCTION foo(int) RETURNS table (a int, b text)
AS
$$
SELECT $1 as a, 'Hello #'||$1 as b;
$ LANGUAGE SQL;现在您可以使用:
select b
from foo(6);如果您关心的是“表”与“记录”,您还可以定义一个type来克服附加的结果集定义:
create type foo_return as (a int, b text);
CREATE FUNCTION foo(int) RETURNS foo_return
AS
$$
SELECT $1, 'Hello #'||$1;
$$ LANGUAGE SQL;您仍然可以选择上面的选项:
select b
from foo(6);第三个可能更像"C“的方法是使用out参数(如手册所示)
CREATE FUNCTION foo(p1 int, out a int, out b text)
AS
$$
SELECT $1, 'Hello #'||$1;
$$
LANGUAGE SQL;那么您就不需要from了:
select (foo(1)).b;发布于 2014-05-03 01:39:09
这是简单直观的吗?
select a
from foo(6) s(a int, b text);https://stackoverflow.com/questions/23439240
复制相似问题