由于单引号转义,Oracle PreparedStatement抛出的值太大

use*_*342 2 java oracle quotes prepared-statement

我似乎有Java批量插入的问题.它的作用是将带有单引号的值插入到Oracle表中.

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

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

Best of Hollywood 2 Movie Collector's Pack: Todeszug nach Yuma / Recue Dawn
Run Code Online (Sandbox Code Playgroud)

正如你所看到的(如果你愿意,可以算一下); 这个长度恰好是75个字符,包括单引号.

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

case Types.VARCHAR:
pstmt.setString(paramIndex, param.getValue().replace("'", "''"));
break;
Run Code Online (Sandbox Code Playgroud)

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

事实是当我在Squirrel中运行insert语句时,它只是插入而没有任何问题.它应该,实际值仍然是75长,只添加一个引用来逃避另一个.

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

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

啊,顺便说一下,在有人建议之前,是的,我试过了:

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

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

虽然这在Squirrel中作为直接SQL语句起作用,但它只使得OraclePreparedStatement抛出错误的字符串值更大.我猜这似乎合乎逻辑.

我知道我可以替换'a ^或者只是放大我的目标列,但我不认为这些"解决方案"是解决这个问题的正确方法.也许这是一件我还没见过的简单的事情?

ada*_*shr 8

AFAIK,我认为你不需要自己处理逃跑,特别是如果你正在使用的话PreparedStatement.只需执行以下操作即可在内部进行转义.

pstmt.setString(paramIndex, param.getValue());
Run Code Online (Sandbox Code Playgroud)