Здравствуйте!
Имеется триггерная функция с запросом:
INSERT INTO table01 (id, t, long_val, double_val, string_val) VALUES ( NEW.id, NEW.t, NEW.long_val, NEW.double_val, NEW.string_val);
Особенность тут такая. Поля long_val, double_val, string_val могут быть null (все или не все).
Собственно всё работает даже так:
INSERT INTO table01 VALUES (NEW.*);
Но появилась нужда определять имя таблицы, в которую вставлять данные в данный момент.
Поэтому пришлось делать запрос так:
EXECUTE 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES ( '||NEW.id||', '''||NEW.t||''', '||NEW.long_val||', '||NEW.double_val||', '||NEW.string_val||', );';
В то же время такая комбинация работает:
EXECUTE 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES ( '||NEW.id||', '''||NEW.t||''', null, null, null );';
Не могу понять, если при изначальном запросе (insert) некоторые поля были null, то в структуре NEW они отсутствуют совсем?
А что за '||'?
А что за '||'?
Не понял, что имеете в виду
Не понял, что имеете в виду конкретно, || - это ж конкатенация.
Вобщем извернулся таким способом:
Покритикуйте.
Null это не значение, а его отсутствие
По крайней мере я так думаю. В структуре NEW NULL есть, но проверить его можно только через is null. Попробуйте без триггера, execute и NEW сделать конкатенацию двух значений, например строку и NULL- получится NULL.
EXECUTE. В чём загвоздка?
если версия postgresql >=8.4, можно так -
иначе так -
не работает запрос с 'execute'
Здравствуйте!
а у меня похожий на предыдущий запрос не работает!
мой код:
namefanc:= 'SETTLEMENT_TYPE_IDS';
execute 'INSERT INTO ' || namefanc || ' ("ID", "NAME") VALUES (' || id || ',' || y || ')';
хотя такой код работает:
INSERT INTO "SETTLEMENT_TYPE_IDS"("ID", "NAME") VALUES (id, y);
выдает: ОШИБКА: колонка "q" не существует (q - это значение y, когда запуская функцию)
QUERY: INSERT INTO "SETTLEMENT_TYPE_IDS" ("ID", "NAME") VALUES (7,q);
CONTEXT: PL/pgSQL function "settlement_type_add2" line 12 at оператор EXECUTE
не могу понять в чем дело...
Умные люди, помогите )))
попробуйте так: XECUTE
попробуйте так:
Обратите внимание -- второй аргумент ф-и COALESCE это не NULL а строковый литерал 'NULL'