Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени? / 4 сообщений из 4, страница 1 из 1
12.11.2008, 22:22
    #35650427
D13
D13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени?
Собственно вот такой вопрос. Сразу поясню зачем это надо - есть триггерная функция на plpgsql, которая должна вешаться на любые таблицы с любыми именами столбцов. При создании триггера на таблицу в качестве параметров триггерной функции указываются поля, которые нужно обрабатывать для этой таблицы. Как можно из NEW или OLD получить значения полей, зная их строковые имена из параметров?
...
Рейтинг: 0 / 0
13.11.2008, 00:02
    #35650468
Гость_0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени?
D13Собственно вот такой вопрос. Сразу поясню зачем это надо - есть триггерная функция на plpgsql, ... Как можно из NEW или OLD получить значения полей, зная их строковые имена из параметров?никак. используйте другой язык.
...
Рейтинг: 0 / 0
13.11.2008, 23:02
    #35653116
D13
D13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени?
Как оказалось есть способ, но он правда скорее из разряда грязных хаков...
Код: plaintext
1.
execute 'select ('||quote_literal(NEW)||'::'||TG_RELID::regclass||').'||quote_ident(field_name) into my_var;
...
Рейтинг: 0 / 0
14.11.2008, 00:38
    #35653213
Гость_0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени?
здорово ! :) сконвертировать запись в строку и потом обратно мне честно говоря в голову не приходило %) на самом деле есть ещё способ - через таблицу, а из таблицы уже можно по названию поля вытащить:
Код: plaintext
1.
create temp table _foo on commit drop as select new;
execute 'select _foo.' || quote_ident(var_with_field_name) into v;

только непонятно как генерировать уникальное название таблицы, если допустим один и тот же тригер несколько раз вызывается в транзакции. можно перед созданием дропать,

Код: plaintext
1.
2.
drop table if exists _foo;
create temp table _foo on commit drop as select new;
execute 'select _foo.' || quote_ident(var_with_field_name) into v;

но непонятно как быть если тригер рекурсивно может вызываться... отслеживать при этом ещё и в какой момент _foo можно удалять как то геморойно...

проще perl использовать:
Код: plaintext
$v = $_TD->{new}{$var_with_field_name};
и безпроблем :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в pl/pgsql вытащить из переменной типа record значение поля по его строковому имени? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]