Исключения при создании триггера в PostgreSQL 9.1

Я использую PostgreSQL 9.1 с PostGIS 1.5.

Я пытаюсь заставить эту триггерную функцию работать в терминале (Ubuntu):

CREATE FUNCTION insert_trigger()
RETURNS trigger AS
$insert_trigger$
BEGIN
IF ( NEW.id >= 10 AND NEW.id < 100 ) THEN 
INSERT INTO part_id_p10 VALUES (NEW.*); 
ELSIF ( NEW.id >= 100 AND NEW.id < 200 ) THEN 
INSERT INTO part_id_p20 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'id out of range.  Something wrong with the insert_trigger() function!';
END IF;
RETURN NULL;
END
$insert_trigger$ LANGUAGE plpgsql;

Я получаю следующие исключения:

SQLException: ERROR: Encountered "FUNCTION" at line 1, column 8.

SQLException: ERROR: Encountered "ELSIF" at line 1, column 1.

SQLException: ERROR: Encountered "ELSE" at line 1, column 1.

SQLException: Cannot commit when autoCommit is enabled.

SQLException: ERROR: Encountered "RETURN" at line 1, column 1.

SQLException: Cannot commit when autoCommit is enabled.

Ответ 1

Я цитирую, что я нашел в онлайн-документации:

Stado написан на Java и взаимодействует с базовыми базами данных через JDBC.

Смелый акцент мой. Исходя из этого, позвольте мне представить эту гипотезу:

Многие здесь знают веб-сайт SQL Fiddle. Он также использует JDBC. Вот что происходит, когда я пытаюсь создать вашу функцию в режиме по умолчанию:

Неудача скрипки

Но это работает:

Рабочий скрипт

Разница? Я изменил "Терминатор запросов" (внизу справа) от ; до //, чтобы JDBC не разбивал оператор. Очевидно, что JDBC не может (пока) правильно обращаться с долларовым котированием. См. комментарий @Craig ниже.

Вы можете обойти проблему, используя терминатор запроса, который не отображается в вашем коде, как в моей скрипке. Или замените долларовые кавычки на простые одиночные кавычки. Однако вам придется избегать каждой отдельной кавычки: