java - 由于单引号转义,Oracle PreparedStatement 抛出 Value Too Large

标签 java oracle prepared-statement quotes

我似乎对 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 抛出错误的字符串值变大。我想这似乎合乎逻辑。

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

最佳答案

据我所知,我认为您不需要自己处理转义,尤其是当您使用 PreparedStatement 时。只需执行以下操作即可处理内部转义。

pstmt.setString(paramIndex, param.getValue());

关于java - 由于单引号转义,Oracle PreparedStatement 抛出 Value Too Large,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10334839/

相关文章:

php - 我可以将数组绑定(bind)到 PDO 查询中的 IN() 条件吗?

c# - 在集合中找不到参数 '?user_email'

java - 如何在 MYSQL 数据库(日期数据类型)上设置 Null

java - 更紧凑的单位矩阵 lambda 表达式

java - 无法从 Firebase Recycler Adapter android java 中的模型检索数据数组项

java - 验证 DTO 中的字段时如何避免重复的 if-else?

sql - GROUP BY 如果组中至少有一个值满足条件则创建组

oracle - sqldeveloper 输出 count(*) 的正确结果,而 sqlplus 结果为零

java - 在单链表中查找倒数第二个节点

oracle - 当 PL/SQL 中出现错误时提供更有意义的消息