Задать вопрос
@Qird

Как сделать что бы функция PostgreSQL возвращала набор записей с переменным количеством столбцов?

Добрый день! В базе есть представление 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
Какой тип возвращаемых данных нужно указать в таком случае?
  • Вопрос задан
  • 3372 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
crazylh
@crazylh
Проблема не в том что возвращает pivotcode, а в том что внутри нее получается недетерминированная таблица. А вращать можно только таблицы сируктура которых заранее известна чтобы определить тип будущих столбцов/строк
Ответ написан
Комментировать
smagen
@smagen
Руководитель разработки Postgres Professional
Посмотрите в сторону расширения hstore.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы