Есть ли в plpgsql возможность получать имена элементов записей и использовать их?

Мне нужно сообщить об элементах записи, используя «уведомление о повышении», но включая имена элементов.

raise notice 'rec=%',r; -- is not very good

Есть ли возможность сделать что-то вроде:

declare
  r record;
  itemname varchar(200);
begin
  select * into r from my_table_unknown_structure;

  for itemname in pg_record_item_names(r)
  loop
    raise notice '%=%,itemname,pg_record_item_value(r,itemname);
  end loop;
end;

person Hink    schedule 03.09.2014    source источник
comment
Для доступа к полям в записи единственный поддерживаемый в настоящее время метод, AFAIK, - это hstore(rec). Что теряет информацию о типе. Если повезет, мы сможем улучшить его, используя поддержку json.   -  person Craig Ringer    schedule 03.09.2014
comment
Выглядит очень многообещающе. Наверное, это решит мою проблему. Спасибо.   -  person Hink    schedule 06.09.2014


Ответы (2)


У вас может быть объект JSON для каждой строки таблицы

select row_to_json(t)
from t;
         row_to_json         
-----------------------------
 {"a":1,"b":"a_value"}
 {"a":2,"b":"another_value"}

Если вам нужна только первая строка и она должна быть набором пар ключ / значение

select *
from json_each ((
    select row_to_json(t)
    from t
    limit 1
))
;
 key |   value   
-----+-----------
 a   | 1
 b   | "a_value"
person Clodoaldo Neto    schedule 03.09.2014
comment
Хорошая попытка, но в первую очередь, мне это нужно быстро для процедур отладки. При выборе нескольких таблиц с объединениями возвращается запись. Мне действительно нужно отобразить запись, но список значений без имен столбцов непрозрачен. - person Hink; 04.09.2014
comment
@Hink: Оба решения в моем ответе показывают имена столбцов. - person Clodoaldo Neto; 04.09.2014

Ответ основан на комментарии CRAIG RINGER с использованием расширения "hstore".
Я хотел бы продвигать его комментарий как ответ.

declare
    r record;
    h hstore;
begin
    select * into r from more_joined_tables;
    select * into h from hstore(r);
    raise notice '%',h;
end;

OR


declare
    r record;
    h record;
begin
    select * into r from price_list;
    for h in select * from each(hstore(r))
    loop
        raise notice '%',h;
    end loop;
end;

person Hink    schedule 06.09.2014