2012-04-05 65 views
3

我想在PostgreSQL 9.1中定义一个函数,它接受多个复合类型的INOUT参数,但我不知道如何调用它。调用具有多个复合输出参数的PostgreSQL函数

例如,

CREATE TYPE my_type_a AS (a integer, b float); 
CREATE TYPE my_type_b AS (c boolean, d varchar(5)); 

CREATE FUNCTION my_complex_func(INOUT a my_type_a, INOUT b my_type_b) 
RETURNS RECORD 
'...' 
LANGUAGE plpgsql; 

定义语句执行得很好,但我不知道如何调用这个函数!我想:

SELECT INTO a, b 
    a, b FROM my_complex_func(a, b); 

但是这给出了一个错误:

ERROR: record or row variable cannot be part of multiple-item INTO list 

回答

3

我不认为这有什么与你的输入类型,或者它们的数量。

不返回一个RECORD,返回一个真正的复合类型(用CREATE TYPE定义)。

错误record or row variable cannot be part of multiple-item INTO list是因为你试图在另一个行中嵌套一个行。

这应该工作:

CREATE TYPE my_type_a AS (a integer, b float); 
CREATE TYPE my_type_b AS (c boolean, d varchar(5)); 
CREATE TYPE ret_type AS (w integer, v boolean); 

CREATE FUNCTION my_complex_func(INOUT a my_type_a, INOUT b my_type_b) 
RETURNS ret_type as $$ 
... 
$$ LANGUAGE plpgsql; 

然后你就可以这样做:

SELECT INTO a, b 
    (x.comp).w, (x.comp).v 
    FROM (select my_complex_func(j, i) as comp) x; 

这个具体的例子对我的作品:

create type smelly1 as (a integer, b text); 
create type smelly2 as (a boolean, b float); 
create type rettype as (w integer, v boolean); 
create function foo_func(n smelly1, m smelly2) returns rettype as $$ 
declare 
    f_ret rettype; 
begin 
    f_ret.w := n.a; 
    f_ret.v := m.a; 
    return f_ret; 
end; 
$$ language plpgsql; 

select (x.comp).w, (x.comp).v from 
    (select foo_func('(4, hello)'::smelly1, '(true,3.14)'::smelly2) as comp) x; 

回报:

w | v 
---+--- 
4 | t 
(1 row) 
+0

糟糕,忘记从子查询(x)写字段名称(comp) – 2012-04-05 08:40:06

+0

是的,但是我需要返回的是复合类型的两个实例(在这种情况下是相同的类型,但可能不同)。有OUT参数时,我必须返回记录:'错误:由于OUT参数,函数结果类型必须记录“。当然,如果有一些方法可以做到这一点,但没有OUT参数也可以。 – EMP 2012-04-05 08:45:52

+0

已添加示例... – 2012-04-05 08:47:14

相关问题