2012-04-05 105 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

相關問題