2012-04-05 7 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 заключается в том, что вы пытаетесь вложить ROW в другую ROW.

Это должно работать:

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

Ой, забыл написать имя-поля (comp) из подзапроса (x) –

+0

Да, но мне нужно вернуть два экземпляра сложного типа (в этом случае один и тот же тип, но может быть другим). Я должен вернуть запись, когда есть параметры OUT: «ERROR: тип результата функции должен быть записан из-за параметров OUT». Конечно, если есть какой-то способ сделать это без параметров OUT, которые тоже будут в порядке. – EMP

+0

Добавлен пример ... –

Смежные вопросы