在 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 中创建触发器时的异常的主要内容,如果未能解决你的问题,请参考以下文章