gpt4 book ai didi

java - 升级 JDBC 驱动程序后,隐式类型转换为 Postgres 中的整数失败

转载 作者:行者123 更新时间:2023-11-29 13:35:27 25 4
gpt4 key购买 nike

我的应用程序目前使用 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 会继续在这里进行隐式转换,但它似乎已经停止了。

我试过在 JDBC 连接 URL 上设置 compatible=8.2 也没有效果。

编辑以下是使用 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 函数由 message 表上的 ON UPDATE 触发器运行,其主体与上面给出的完全一样。第 4 行对应于 SELECT INTO 语句。我可以确认 EXTRACT(EPOCH...) 确实返回了一个 double precision,它确实应该返回。

使用 8.2(jdbc4 和 jdbc3)驱动程序,不会发生此错误,并且语句处理正确。

最佳答案

检查 JDBC 驱动程序是否正在设置 *extra_float_digits*。发行说明说,从 8.3-dev602 开始,它在连接时设置为“2”,而通常默认为零。我无法重现您的行为(我只有 9.1 和 9.2 可以测试)。但是,我可以这样做:

postgres=# set extra_float_digits = 2;
SET
postgres=# select extract(epoch from current_timestamp(3));
date_part
--------------------
1355346251.7550001
(1 row)

postgres=# select extract(epoch from current_timestamp(3));
date_part
--------------------
1355346253.1619999
(1 row)

当乘以 1000 并分配给 BIGINT 时,我不能让它失败,但这可能是特定于 8.2 的东西,因此您必须使用 9.2 驱动程序并显式运行语句 SET 进行测试extra_float_digits = 0 在您完成连接之后,但在运行失败的查询之前。

关于java - 升级 JDBC 驱动程序后,隐式类型转换为 Postgres 中的整数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13826976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com