我使用 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;
我得到这个异常(exception):
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.
最佳答案
我引用了我在 online documentation 中找到的内容:
Stado is written in Java and communicates with the underlying databases via JDBC.
大胆强调我的。基于此,我提出一个假设:
这里的很多人都知道网站SQL Fiddle。它也使用 JDBC。以下是当我尝试在默认模式下创建您的函数时发生的情况:
但是这个有效:
区别是什么?我将“查询终止符”(右下角)从 ;
更改为 //
以防止 JDBC 破坏语句。显然,JDBC 不能(还)处理 dollar-quoting正确。参见 @Craig's comment下面。
您可以通过使用未出现在您的代码中的查询终止符来规避该问题,例如我的 fiddle 。或者用普通的单引号替换美元引号。不过,您必须正确转义每个单引号:
关于database - 在 PostgreSQL 9.1 中创建触发器时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22747225/