[trigger] функция копирования добавляемой строки в другую таблицу

Добрый день.

Дано:

1) таблица g1 - содержит порядка 95 полей, одно из них - метка времени без зоны, сюда значения пишутся раз в секунду
2) таблица g1_min - (структура идентична g1), содержит строки из g1 , у которых секунды = 00
3) таблица g1_hour - (структура идентична g1), содержит строки из g1 , у которых минуты = 00 и секунды = 00

Надо:
1) при вставке строки в g1, парсить timestamp и если секунды и/или минуты = 00, то копировать строку в соотвествующие g1_min, g1_hour

Что сделано:
Таблиц подобных g1 аж 7 (g1, g2.....g7). Раньше была одна таблица с более 1300 полей, поля имели префиксы g1_, g2_ и т.д. и функция была с жестко прописанными именами таблиц:

begin 
 
IF (SELECT EXTRACT(SECOND FROM NEW.dateandtime) = 0) then  
 
	INSERT INTO val_min SELECT NEW.*;
 
end IF;
 
IF ((SELECT EXTRACT(MINUTE FROM NEW.dateandtime)) = 0) AND ((SELECT EXTRACT(SECOND FROM NEW.dateandtime)) = 0) then  
 
	INSERT INTO val_hour SELECT NEW.*;
 
end IF;
 
RETURN NEW;
 
end;

Все работало корректно, но медленнее, чем хотелось. Разделили параметры по таблицам. Теперь имя таблиц для минут и часов надо формировать динамически относительно имени таблицы, где сработал триггер (дописывать '_min', '_hour').
Делаю так:
 
DECLARE 
tb_name character(10); 
 
begin 
 
IF (SELECT EXTRACT(SECOND FROM NEW.dateandtime) = 0) then  
	tb_name := TG_TABLE_NAME || '_min';
	INSERT INTO tb_name SELECT * FROM NEW; 	
 
end IF;

для запроса:
INSERT INTO g1 VALUES ('2013-10-08 12:00:00', 12, 12, 12, 12, 
            12, 12, ..остальные_значения...); 

возвращает ошибку:
ОШИБКА: отношение "tb_name" не существует
LINE 1: INSERT INTO tb_name SELECT * FROM NEW

если так:

DECLARE 
tb_name character(10); 
sql text;
 
begin 
 
 
IF (SELECT EXTRACT(SECOND FROM NEW.dateandtime) = 0) then  
 
	tb_name := TG_TABLE_NAME || '_min';
	sql := 'INSERT INTO ' || tb_name || ' SELECT  ' || NEW || ';';
	execute sql;

то возвращает ошибку:

ОШИБКА: колонка "2013-10-08 12:00:00" не существует
LINE 1: INSERT INTO g1_min SELECT ("2013-10-08 12:00:00",12,12,12,1...

почему значение '2013-10-08 12:00:00' воспринимается как имя колонки ? откуда там появились двойные кавычки ?

Короче перепробовал много вариантов - результат отрицательный.

Вопрос:
1) можно ли в функции динамически формировать имя таблицы и инсёртить туда строку NEW ?
2) если да, то как ?

P.S. http://postgresql.ru.net/docs/extented_FAQ.html#Q003 читал. неужели это мой случай ?

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

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

всем спасибо.решение взял

всем спасибо.
решение взял тут http://postgresql.ru.net/node/214512
выглядит так

EXECUTE 'INSERT INTO '|| tb_name||' SELECT $1.* ' USING NEW;

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

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

Back to top

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