【问题标题】:What is the jdbc type and java type for LONG RAW column?LONG RAW 列的 jdbc 类型和 java 类型是什么?
【发布时间】: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。

使用 longvarbinarybyte[] 后,如 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


【解决方案1】:

我认为你应该使用byte[]LONGVARBINARY

【讨论】:

  • 当我尝试这个时,我得到一个类转换异常:java.lang.String 无法转换为 [L java.lang.Byte。有什么想法吗?
  • 我没用过ibatis,但是试试procData.put("fileData", bytes)。您想保存文件中的原始字节。
  • 我需要保存文件中的再见,但它们必须是十六进制的。该列包含我在问题中发布的十六进制数据。
  • 你确定吗?我认为该列包含以十六进制显示的原始字节(因此列类型为 RAW)。我仍然认为你应该保存字节而不用十六进制编码。
  • mybatis 似乎在尝试使用 Byte[] 而不是 byte[]。您现在的配置如何?
【解决方案2】:

根据 Hibernate Oracle 的方言,它将是 LONGVARBINARY。见org.hibernate.dialect.Oracle8iDialect:

registerColumnType( Types.LONGVARBINARY, "long raw" );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多