Доброго времени суток, уважаемые форумчане.
Не нашел лучшей ветки, чем эта, ибо сабж происходит как раз в постгре.
Запилил триггерную функцию. Повесил на BEFORE INSERT. Работает все, за исключением конструкции IF. Менял функцию на "не триггерную", возвращал значения переменных. Все переменные в порядке.
Собсно код
$BODY$
DECLARE _tname varchar(25);
_date varchar(10);
c_q varchar;
i_q varchar;
BEGIN
_date = to_char(to_timestamp(NEW.eventtimestamp), 'DDMMYYYY');
_tname = 't' || substring(NEW.userid from 25 for 36) || '_' || _date;
c_q = 'CREATE TABLE tmp.'|| _tname ||' (
eventid character(36) NOT NULL,
userid character(36) NOT NULL,
userfio character(50) NOT NULL,
turniket character(10) NOT NULL,
prizn character(6) NOT NULL,
eventtimestamp integer NOT NULL);';
i_q = 'INSERT INTO tmp.'|| _tname ||' (eventid, userid, userfio, turniket, prizn, eventtimestamp) values (
''' || NEW.eventid || ''',
''' || NEW.userid || ''',
''' || NEW.userfio || ''',
''' || NEW.turniket || ''',
''' || NEW.prizn || ''',
''' || NEW.eventtimestamp || ''');';
-- Провереряем, создана ли таблица
PERFORM * from pg_tables where tablename like ''||_tname||'';
IF NOT FOUND THEN
EXECUTE c_q;
COMMIT;
END IF;
EXECUTE i_q;
RETURN NEW;
END;
$BODY$
По результатам работы функции ВСЕГДА создается таблица, даже если она уже была создана на предыдущей итерации.
Испробывал следующие варианты:
- SELECT INTO _record * from pg_tables where tablename like ''||_tname||'';
IF _record IS NULL THEN
...
END IF;
- EXECUTE 'SELECT * from pg_tables where tablename like ''||_tname||'';' INTO _varchar;
IF (char_length(_varchar) > 0) THEN
...
END IF;
Еще что то пробывал... В общем ничего не помогает. Результат один.
Готов смиренно перенести любую критику и выслушать любые варианты :-)