【问题标题】:Exceptions when creating a trigger in PostgreSQL 9.1在 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。为什么您的问题中缺少这些信息?这是解决问题的关键。

标签: database postgresql triggers stado


【解决方案1】:

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

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

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

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

Failing fiddle

但这一个有效:

Working Fiddle

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

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

【讨论】:

  • 哦!所以只需替换所有';' with '//' 会解决问题吗?
  • 好吧,替换 JDBC 的相应设置,而不是替换代码中的 ;,它必须仍然对 Postgres 有效。这应该可以防止 JDBCC 在每个 ; 处扼杀该语句。至少这适用于 SQL Fiddle。我从未使用过 Stado。
  • 是的,你明白了:PgJDBC 的解析器目前还不够聪明,无法正确处理美元报价。欢迎使用补丁。
  • 知道了。非常感谢!
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2012-04-07
  • 2021-08-04
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多