Добрый день! В базе есть представление crossview, которое возвращает данные в таком виде:
org_id name value
1 index 656569
2 index 656569
1 opf_org_full МУП
2 opf_org_full ФГУП
1 name_org_full Тест1
2 name_org_full Тест2
Где org_id - id организации, name - название атрибута организации, value - значение атрибута.
Мне нужно получить данные в таком виде:
org_id index opf_org_full name_org_full
1 656569 МУП Тест1
2 656022 ФГУП Тест2
Для этого я написал функцию в Postgres:
CREATE FUNCTION pivotcode(tablename anyelement, rowc character varying, colc character varying, cellc character varying, celldatatype character varying) RETURNS SETOF anyelement
LANGUAGE plpgsql
AS $$
declare
dynsql1 varchar;
dynsql2 varchar;
columnlist varchar;
sql1 varchar;
sql2 varchar;
begin
-- 1. retrieve list of column names.
dynsql1 = 'select string_agg(distinct ''_''||'||colc||'||'' '||celldatatype||''','','' order by ''_''||'||colc||'||'' '||celldatatype||''') from '||pg_typeof(tablename)||';';
execute dynsql1 into columnlist;
-- 2. set up the crosstab query
dynsql2 = 'select * from crosstab (
''select '||rowc||','||colc||','||cellc||' from '||pg_typeof(tablename)||' order by 1,2'',
''select distinct '||colc||' from '||pg_typeof(tablename)||' order by 1''
)
as newtable (
'||rowc||' int,'||columnlist||'
);';
RETURN QUERY EXECUTE dynsql2;
end
$$;
И пытаюсь выполнить ее так:
select * from pivotcode(NULL::crossview,'org_id','name','value','text');
Получаю ошибку:
ERROR: structure of query does not match function result type
DETAIL: Returned type text does not match expected type character varying(1024) in column 2.
CONTEXT: PL/pgSQL function "pivotcode" line 20 at RETURN QUERY
Какой тип возвращаемых данных нужно указать в таком случае?