Используется 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 завершает свою работу при использовании тригера?
Спасибо.