database - 在 PostgreSQL 9.1 中创建触发器时出现异常

标签 database postgresql triggers stado

我使用 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。以下是当我尝试在默认模式下创建您的函数时发生的情况:

Failing fiddle

但是这个有效:

Working Fiddle

区别是什么?我将“查询终止符”(右下角)从 ; 更改为 // 以防止 JDBC 破坏语句。显然,JDBC 不能(还)处理 dollar-quoting正确。参见 @Craig's comment下面。

您可以通过使用未出现在您的代码中的查询终止符来规避该问题,例如我的 fiddle 。或者用普通的单引号替换美元引号。不过,您必须正确转义每个单引号:

关于database - 在 PostgreSQL 9.1 中创建触发器时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22747225/

相关文章:

ruby-on-rails - 新数据不会持久保存到 Postgres 上的 Rails 数组列

java - 使用 Java 将图像上传到 PostgreSQL

如果 doc 的关键字发生变化,则 MySQL 会触发 doc 的更新时间戳

mysql - 如果值未更改,则 SQL 触发器更新记录而不是插入

python - Flask 注册错误 : missing 1 positional argument

php - 组织数据库结构

sql - 提高 Rails 应用程序中复杂 postgres 查询的速度

mysql - 如何跟踪谁更改了表中的记录

database - 什么是数据库事务?

java - 如何优化从平面文件到 BD PostgreSQL 的数据导入?