EXECUTE. В чём загвоздка?

Здравствуйте!
Имеется триггерная функция с запросом:

			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||',
				);';

Получаю ошибку: ERROR: query string argument of EXECUTE is null

В то же время такая комбинация работает:

			EXECUTE 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES (
				'||NEW.id||',
				'''||NEW.t||''',
				null,
				null,
				null
				);';

Не могу понять, если при изначальном запросе (insert) некоторые поля были null, то в структуре NEW они отсутствуют совсем?

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

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

А что за '||'?

А что за '||'?

Не понял, что имеете в виду

Не понял, что имеете в виду конкретно, || - это ж конкатенация.
Вобщем извернулся таким способом:

			EXECUTE 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES (
				'||NEW.id||',
				'||quote_nullable(NEW.t)||',
				'||quote_nullable(NEW.long_val)||',
				'||quote_nullable(NEW.double_val)||',
				'||quote_nullable(NEW.string_val)||'
				);';

Покритикуйте.

Null это не значение, а его отсутствие

По крайней мере я так думаю. В структуре NEW NULL есть, но проверить его можно только через is null. Попробуйте без триггера, execute и NEW сделать конкатенацию двух значений, например строку и NULL- получится NULL.

EXECUTE. В чём загвоздка?

если версия postgresql >=8.4, можно так -

	execute 'INSERT INTO table01 (id, t, long_val, double_val, string_val) VALUES ($1, $2, $3, $4, $5)' 
	  USING new.id, new.t, NULL::numeric, NULL::numeric, NULL;

иначе так -
	execute 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES (
				'||NEW.id||',
				'''||NEW.t||''',
				null::numeric,
				null::numeric,
				null::varchar
				);';

не работает запрос с '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

попробуйте так:

XECUTE 'INSERT INTO '||table_name||' (id, t, long_val, double_val, string_val) VALUES (
				'|| COALESCE(NEW.id, 'NULL')||',
				'''|| COALESCE(NEW.t, 'NULL') ||''',
				' || COALESCE(NEW.long_val, 'NULL') ||',
				'|| COALESCE(NEW.double_val, 'NULL') ||',
				'|| COALESCE(NEW.string_val, 'NULL') ||',
				);';

Обратите внимание -- второй аргумент ф-и COALESCE это не NULL а строковый литерал 'NULL'

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

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

Back to top

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