【发布时间】:2018-07-07 19:49:57
【问题描述】:
我遇到了一个奇怪的问题。我有一张桌子file_data。它有一个名为filedata 的列,数据类型为long raw。在此列中,excel 文件的十六进制表示形式存储为D01A01....。现在我有一个名为“PROC_STORE_DATA”的程序。我正在从我的 java 类中调用此过程,并尝试在该表列中插入一个 excel 电子表格内容。
在我的 Java 类中,我得到的文件内容如下:
byte[] bytes = fileData.getBytes();
StringBuffer hexSt = new StringBuffer();
for(byte b : bytes){
hextSt.append(Integer.toHexString(b & 0xff));
}
我有一个名为 procData 的哈希图,我在其中推送此 hexSt 变量。
procData.put('fileData',hextSt.toString().toUpperCase());
然后,我调用我的更新方法通过我的过程更新表:
myUpdateDao().update(PROC_STORE_DATA,procData);
在 mybatis.xml 中,这是我在参数映射中定义要更新的列的方式:
<parameterMap>
<parameter property="updatefileData" javatype="java.lang.String" jdbcType="LONGVARCHAR">
</parameterMap>
但是在运行这个之后,我得到了这个错误:wrong number or types of arguments in the procedure call - PLS-00306 and ORA-06550。
我花了两天时间,但我不明白问题出在哪里。问题可能出在 javaType 和 jdbcType 上,但我不确定我应该在这里为数据类型为 LONG RAW 的列提供什么作为 javaType 和 jdbcType。
使用 longvarbinary 和 byte[] 后,如 ewramner 的回答中所述,
我收到一个类转换异常:java.lang.String 无法转换为 [L java.lang.Byte
【问题讨论】:
-
数据类型映射are in the docs。 LONG 和 LOG RAW 是不同的数据类型,一种是字符,另一种是二进制。
-
@AlexPoole 谢谢亚历克斯
-
不要将字节转换为十六进制字符串,尝试插入原始字节值
-
@MarkRotteveel 试过了...现在我得到另一个类转换异常,它说 [B 不能转换为 [L java.lang.Byte
标签: java oracle jdbc long-integer