Функция может иметь только входной параметр (ключевое слово IN, которое фактически необязательно): вы не можете использовать INOUT.
Для этого сценария вы можете объявить параметр функции с только что созданным именем типа. Пример:
Со следующим вводом:
create type my_type as(field varchar(2) array[50]);
create table my_table(c1 serial, c2 my_type);
insert into my_table(c2) values (row(array ['aa', 'bb' ]));
insert into my_table(c2) values (row(array ['cc', 'dd' ]));
select * from my_table;
--
create function my_function(p_val my_type) returns my_type
language plpgsql
as $$
begin
p_val.field = (array['ok','ok']);
return p_val;
end;
$$;
--
create procedure my_proc ()
language plpgsql
as $$
declare
l_var1 my_table;
l_var2 my_table;
begin
select c2 into l_var1.c2 from my_table limit 1;
raise notice 'input value=%', l_var1.c2;
select my_function(l_var1.c2) into l_var2.c2;
raise notice 'returned value=%', l_var2.c2;
end;
$$;
У меня есть следующий вывод:
create type my_type as(field varchar(2) array[50]);
CREATE TYPE
create table my_table(c1 serial, c2 my_type);
CREATE TABLE
insert into my_table(c2) values (row(array ['aa', 'bb' ]));
INSERT 0 1
insert into my_table(c2) values (row(array ['cc', 'dd' ]));
INSERT 0 1
select * from my_table;
c1 | c2
----+-------------
1 | ("{aa,bb}")
2 | ("{cc,dd}")
(2 rows)
create function my_function(p_val my_type) returns my_type
language plpgsql
as $$
begin
p_val.field = (array['ok','ok']);
return p_val;
end;
$$;
CREATE FUNCTION
create procedure my_proc ()
language plpgsql
as $$
declare
l_var1 my_table;
l_var2 my_table;
begin
select c2 into l_var1.c2 from my_table limit 1;
raise notice 'input value=%', l_var1.c2;
select my_function(l_var1.c2) into l_var2.c2;
raise notice 'returned value=%', l_var2.c2;
end;
$$;
CREATE PROCEDURE
call my_proc();
psql:tt.sql:74: NOTICE: input value=("{aa,bb}")
psql:tt.sql:74: NOTICE: returned value=("{ok,ok}")
CALL