我的应用程序目前使用 Postgres 8.2 JDBC 驱动程序(带有 Postgres 8.2 数据库),但我们正在升级到 Java 7 和 JDBC 4 驱动程序,目前是 9.2-1002 版本。最终配置将是带有 Postgres 8.2 数据库的 JDBC 9.2 驱动程序。
在我们的一个触发函数中抛出了一个异常,它只在使用 9.2 驱动程序运行时发生。这是ON UPDATE
另一个表上的触发器。触发器有效地执行:
DECLARE
mytime bigint;
BEGIN
SELECT INTO mytime EXTRACT(EPOCH FROM current_timestamp(3))*1000;
UPDATE resource SET lastmodified=mytime WHERE id=NEW.resource_id;
END
该resource.lastmodified
列定义为 BIGINT 类型。
发生的 SQL 错误是:
ERROR: invalid input syntax for integer: "1355248911435.9998"
Where: PL/pgSQL function "f_modify_resource" line 4 at SQL statement;
显然错误就在这SELECT INTO
条线上;这里应该有一个 BIGINT 的演员表。但是,我想知道为什么该语句使用 8.2 JDBC 驱动程序成功,但在没有其他任何更改的情况下使用 9.2 驱动程序失败?既然触发代码在数据库内部运行,这对 JDBC 驱动程序不应该是透明的吗?我以为 PostgreSQL 会继续在这里进行隐式转换,但它似乎已经停止了。
我试过设置compatible=8.2
JDBC 连接 URL 也没有效果。
编辑 这是使用 9.2-1002.jdbc4 驱动程序运行时语句日志中的输出(我可以确认这至少发生在 9.0 驱动程序之前,可能更早):
STATEMENT: UPDATE message SET hastext='true' WHERE rid='2-1355323570239' AND mid='1-1355329102968'
ERROR: 22P02: invalid input syntax for integer: "1355329102985.0002"
CONTEXT: PL/pgSQL function "f_modify_resource" line 4 at SQL statement
LOCATION: scanint8, int8.c:137
该f_modify_resource
函数由表ON UPDATE
上的触发器运行message
,其主体与上面给出的完全相同。第 4 行对应于SELECT INTO
语句。我可以确认EXTRACT(EPOCH...)
确实返回 a double precision
,而且确实应该返回。
使用 8.2(jdbc4 和 jdbc3)驱动程序,不会发生此错误,并且语句可以正确处理。