SQL: ошибка вставки множетсва данных при использовании тригера

Модератор: Модераторы разделов

IMB
Сообщения: 2516
ОС: Debian

SQL: ошибка вставки множетсва данных при использовании тригера

Сообщение IMB »

Доброго дня!
Используется Postgre 9.3.5.
Для вставки значений в таблицу используется хранимая функция, одним запросом может вставлятся несколько строк, запрос на вставку строится динамически и выполняется через EXECUTE.
Теперь на основе этих данных необходимо собирать некоторую статистику, для этого я сделал отдельную таблицу и создал тригерную функцию, которую вызываю после вставки каждой строки данных.
Отладка показала, что тригер срабатывает, но сама функция прекращает свою работу.
функция вставки

Код: Выделить всё

DECLARE
val_len SMALLINT DEFAULT array_length($3, 1);
cmd TEXT DEFAULT 'INSERT INTO trassa.cpu_load (device, device_timestamp, cpu, value) VALUES';
result SMALLINT;
ts TIMESTAMP DEFAULT to_timestamp($2);
BEGIN IF val_len = array_length($4, 1) THEN
		FOR i IN 1..val_len LOOP
			cmd = cmd || '(' ||
				$1::text ||
				',''' || ts::text || ''',' ||
				$3[i]::text || ',' ||
				$4[i]::text || ')';
			IF i != val_len THEN
				cmd = cmd || ',';
			END IF;
		END LOOP;
		EXECUTE cmd;
		GET DIAGNOSTICS result = ROW_COUNT;
		RAISE USING MESSAGE = 'Len ' || val_len::text || ', Result ' || result::text;
		IF result = val_len THEN
			RETURN TRUE;
		ELSE
			RETURN FALSE;
		END IF;
	ELSE
		RETURN FALSE;
	END IF;
END; 

Вывод приложения во время работы:

Код: Выделить всё

Failed update_cpu_load_list(5, 1532, {0,1,255},{7,13,10})
: ERROR:  Trigger result 1 // отладка из тригера
CONTEXT:  SQL statement "INSERT INTO trassa.cpu_load (device, device_timestamp,
cpu, value) VALUES(5,'1970-01-01 03:25:32',0,7),(5,'1970-01-01 03:25:32',1,13),(5,'1970-01-01 03:25:32',255,10)"
PL/pgSQL function update_cpu_load_list(integer,integer,smallint[],smallint[]) line 19 at EXECUTE statement

Как видите в данном случае вставляет три строки и в выводе отсутствует отладочный вывод из неё.
Конечно переписать функцию на вставку данных в цикле не проблема, но это не так эффективно.
Вопрос - почему EXECUTE завершает свою работу при использовании тригера?
Спасибо.
Спасибо сказали: