2

我似乎对 Java 批量插入有问题。它所做的是将带有单引号的值插入到 Oracle 表中。

java.sql.BatchUpdateException: ORA-12899: value too large for column "P40_001_CM"."PRODUCTDATA"."P_NAME" (actual: 76, maximum: 75)

事实是我需要作为 P_NAME 插入的值是:

Best of Hollywood 2 Movie Collector's Pack: Todeszug nach Yuma / Recue Dawn

如您所见(如果您愿意,也可以数数);这正好是 75 个字符的长度,包括单引号。

我用来处理单引号的代码片段:

case Types.VARCHAR:
pstmt.setString(paramIndex, param.getValue().replace("'", "''"));
break;

这种方法有效,它适用于我的大多数插入,但在这种特殊情况下,它将计算添加的单引号导致整个字符串的长度为 76。从而导致异常。

问题是当我在 Squirrel 中运行插入语句时,它只是插入而没有任何问题。它应该,实际值仍然是 75 长,只添加了一个引号来转义另一个。

不知何故,内部使用的 OraclePreparedStatement 对传递的字符串的长度进行了某种检查(显然不是一个很好的检查),并在它实际到达 Oracle 本身之前将其解除,或者看起来如此。

我怎样才能解决这个问题 ?我不能是唯一遇到这种行为的人吗?

啊,顺便说一句,在任何人建议之前,是的,我已经尝试过:

`insert into GERMANSTUFF values('Best of Hollywood 2 Movie Collector'||chr(39)||'s Pack: Todeszug nach Zuma / Recue Dawn');`

insert into GERMANSTUFF values(translate('Best of Hollywood 2 Movie Collector^s Pack: Todeszug nach Puma / Recue Dawn','^',chr(39)));

尽管这在 Squirrel 中作为直接 SQL 语句起作用,但它只会使 OraclePreparedStatement 引发错误的字符串值变大。我猜这似乎是合乎逻辑的。

我知道我可以用'a替换^或只是扩大我的目标列,但我不认为这些“解决方案”是解决这个问题的正确方法。也许这是我还没见过的简单的东西?

4

1 回答 1

8

AFAIK,我认为您不需要自己处理转义,特别是如果您使用PreparedStatement. 只需执行以下操作即可处理内部转义。

pstmt.setString(paramIndex, param.getValue());
于 2012-04-26T13:51:30.220 回答