2014-03-30 69 views
1

我在PostGIS 1.5中使用PostgreSQL 9.1。在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

作品。也許你的文件中有BOM。你使用過哪個編輯器?在Linux終端中使用 – wildplasser

+0

。實際上我正在開發一個羣集數據庫系統stado。除了這個函數,所有的sql命令都能正常工作。 – Shadin

+0

'hexdump -c myfile.sql |頭「來查看文件開頭是否有奇怪的字符。 – wildplasser

回答

2

我引用我在online documentation發現:

Stado使用Java編寫,並通過與底層數據庫進行通信JDBC

大膽重視我的。基於此,讓我提出一個這樣的假設:

許多這裏知道的網站SQL小提琴。它也使用JDBC。這是當我嘗試在默認模式下,以創建功能會發生什麼:

Failing fiddle

但是這一個工程:

Working Fiddle

的區別?我將「Query Terminator」(右下角)從;更改爲//,以防止JDBC對該陳述進行屠殺。顯然,JDBC不能正確處理dollar-quoting。見下面的@Craig's comment

你可以通過使用不會出現在你的代碼中的查詢終結符來避開這個問題,就像我的小提琴一樣。或用簡單的單引號替換美元報價。你必須正確地逃脫每單引號,雖然:這裏

+0

哦!所以只需全部替換';' '//'會解決問題嗎? – Shadin

+0

好吧,替換JDBC的相應設置,不要替換代碼中的';',它必須對Postgres仍然有效。這應該讓JDBCC免於在每個';'處亂用聲明。至少這與SQL Fiddle一起工作。我從未使用過Stado。 –

+2

是的,你明白了:PgJDBC的解析器目前還不夠聰明,無法正確處理美元報價。補丁歡迎。 –