2014-03-30 6 views
1

Я использую PostgreSQL 9.1 с PostGIS 1.5.Исключения при создании триггера в PostgreSQL 9.1

Я пытаюсь получить эту функцию триггера для работы в терминале (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. 
+0

Работы здесь. Возможно, у вас есть спецификация в вашем файле. Какой редактор вы использовали? – wildplasser

+0

в терминале Linux. фактически я работаю над stado, который является кластерной системой db. все команды sql работают отлично, за исключением этой функции. – Shadin

+0

'hexdump -c myfile.sql | head ', чтобы увидеть, есть ли странные символы в начале файла. – wildplasser

ответ

2

цитирует то, что я нашел в online documentation:

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

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

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

Failing fiddle

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

Working Fiddle

разница? Я изменил «Терминатор запросов» (внизу справа) от ; до //, чтобы JDBC не разбивал отчет. Очевидно, JDBC не может (пока) иметь дело с dollar-quoting правильно. См. Ниже @Craig's comment.

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

+0

ooh! поэтому просто замените все ';' с '//' решит проблему? – Shadin

+0

Ну, замените соответствующую настройку для JDBC, а не замените ';' в коде, который все равно должен быть действительным для Postgres. Это должно заставлять JDBCC отбивать оператор на каждом ';'. По крайней мере, это работает с SQL Fiddle. Я никогда не пользовался Стадо. –

+2

Да, вы поняли, что парсер PgJDBC в настоящее время недостаточно умен, чтобы правильно справляться с долларовым цитированием. Патчи приветствовались. –

Смежные вопросы