Добрый день.
Дано:
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;
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, ..остальные_значения...);
если так:
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
выглядит так