Подстановка значения вместо имени переменной

Изображение Игорь

В краце, хочется иметь одну триггерную функцию на вставку, ну или хотя бы одну на группу таблиц. Имена таблиц содержат оперделённый индекс, этот же индекс используется и в именах полей. [например, table01 -> id01, table02 ->id02]. В триггерной функции, я вычисляю имя поля и сохраняю его в переменной, затем с помощью триггерной процедуры NEW, нужно присвоить этому полю определённый контент, выглядит так:

DECLARE
cFieldName VARCHAR(15);
cTabName VARCHAR(15);
cIndex VARCHAR(3)
BEGIN
cTabName := TG_TABLE_NAME; --например 'table01'
cIndex := substr(cTabNaname,6);
cFieldName := 'id' || cIndex;
-- Теперь в cFieldName находится имя поля 'id01', в которое нам надо запихнуть данные
NEW.%cFieldName% --так вот, вместо cFieldName нужно подставить его содержимое, например 'id01'

В документации ничего подобного не заметил, конечно, можно проблему решить множеством блоков IF - END IF. Но хочется изящества :-)

Спасибо за внимание.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Попробуйте

Попробуйте почитать здесь:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-implementation.ht...
возможно наведёт на какие-то мысли.

Честно говоря, проще было бы если уж разные таблицы, то сделать в них одинаковые имена полей - иначе какой смысл вообще разносить их по разным таблицам? Но дело ваше, что сделано, то сделано. Почитайте ссылочку - может чего полезное найдёте.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков

Пока эту

Изображение Игорь

Пока эту проблему с макроподстановкой не решил [да наверное возможности такой в plpgsql и нет], а разные имена полей у меня для того, чтобы каждый аттрибут любой таблицы был уникальным в базе.

Вот это-то и не

Вот это-то и не понятно. Если таблицы содержат одинаковые сущности (а во всей видимости это так, раз у вас с ними работает одна и та же функция), то логичней было бы и атрибуты сделать одинаковыми.

Автор впрочем вы и вам виднее, просто тогда не пришлось бы преодолевать проблему по причине её отсутствия. :)
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков

:). Вот, и как раз

Изображение Игорь

:). Вот, и как раз таки и должно быть понятно, разные таблицы - разные сущности.

Но

Но обрабатываются при этом одним триггером? Очень странно!

По самому вопросу - да я глянул доки и нашёл что-то похожее на то, что тебе нужно. Только увы реализуется оно не подстановкой переменных а блоками IF. Так что соглашусь, что такой возможности в pl/sql нет.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков

admin> Но

Изображение Игорь

admin> Но обрабатываются при этом одним триггером? Очень странно!

Триггер у каждой таблицы свой, а вот триггерная функция, на которую ссылаются триггеры одна. А у же в ней, я разгребаю откуда и куда. Для меня это наглядней.

admin> Так что соглашусь, что такой возможности в pl/sql нет.
А вот то что такой возможности нет, действительно странно.

используйте

используйте plperl.

plperl

Изображение Игорь

Вот, только из-за этого - "SPI is not yet fully implemented", можно отказался от plperl. Да и plpgsql, можно сказать, классика.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023