在 PostgreSQL 9.1 中创建触发器时的异常

Posted

技术标签:

【中文标题】在 PostgreSQL 9.1 中创建触发器时的异常【英文标题】:Exceptions when creating a trigger in PostgreSQL 9.1 【发布时间】:2014-05-09 22:40:55 【问题描述】:

我使用 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.

【问题讨论】:

在这里工作。也许您的文件中有一个 BOM。你用的是哪个编辑器? 在 Linux 终端中。实际上我正在研究 stado 这是一个集群数据库系统。除此功能外,所有 sql 命令都可以正常工作。 hexdump -c myfile.sql | head 看看文件开头有没有奇怪的字符。 哪个文件?我直接在命令行中输入这个函数。这样可以吗?我还运行其他 sql 命令,例如 select、insert... 等。所有这些都可以正常工作,但是这个。 所以您正在使用 Stado。为什么您的问题中缺少这些信息?这是解决问题的关键。 【参考方案1】:

我引用我在online documentation 中找到的内容:

Stado 是用 Java 编写的,通过 JDBC 与底层数据库通信。

我的大胆强调。基于此,我提出一个这样的假设:

这里的许多人都知道网站 SQL Fiddle。它也使用 JDBC。以下是我尝试在默认模式下创建函数时发生的情况:

Failing fiddle

但这一个有效:

Working Fiddle

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

您可以通过使用未出现在您的代码中的查询终止符来规避该问题,就像在我的小提琴中一样。或者用普通的单引号替换美元引号。但是,您必须正确地转义每个单引号:

Insert text with single quotes in PostgreSQL

【讨论】:

哦!所以只需替换所有';' with '//' 会解决问题吗? 好吧,替换 JDBC 的相应设置,而不是替换代码中的 ;,它必须仍然对 Postgres 有效。这应该可以防止 JDBCC 在每个 ; 处扼杀该语句。至少这适用于 SQL Fiddle。我从未使用过 Stado。 是的,你明白了:PgJDBC 的解析器目前还不够聪明,无法正确处理美元报价。欢迎使用补丁。 知道了。非常感谢!

以上是关于在 PostgreSQL 9.1 中创建触发器时的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在Postgresql中创建序列数并应用在数据表

postgresql“而不是”错误

在 postgreSQL 中创建表

如何在 postgresql 中创建只读视图,类似于 oracle?

如何在 PostgreSQL 中创建只读用户?

无法在 postgresql 中创建用户