3

複合型の複数のINOUTパラメータをとる関数をPostgreSQL9.1で定義したいのですが、その呼び出し方法がわかりません。

例えば。

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
4

1 に答える 1

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)
于 2012-04-05T08:25:43.830 に答える