【问题标题】:Inserting byte[] array as blob in Oracle Database getting ORA-01460: unimplemented or unreasonable conversion requested在 Oracle 数据库中将字节 [] 数组作为 blob 插入得到 ORA-01460:请求未实现或不合理的转换
【发布时间】:2011-12-09 07:13:33
【问题描述】:

我有一个 java 存储过程,我试图将一个 byte[] 数组插入到表中的 oracle blob 字段中。

我如下创建了一个准备好的语句,但是当我执行准备好的语句时它会随机失败。我已经缩小了问题来自 pstmt.setBytes(4,content) 的范围。我得到的错误是:

ORA-01460:请求的转换未实现或不合理。

private static void insertFile(Connection connOracle, int zipFileId, byte[] data, String filepath, String filename ) throws SQLException {

try {
    String QUERY = "INSERT INTO files(file_id, zip_file_id, filename, file_path, content) VALUES(SEQ_FILE_ID.nextval,?,?,?,?)";

    PreparedStatement pstmt = connOracle.prepareStatement(QUERY);

    pstmt.setInt(1,zipFileId);
    pstmt.setString(2, filename);
    pstmt.setString(3, filepath);
    pstmt.setBytes(4, data);

    System.out.println("INSERTING file_id " + filepath + ", " + filename + " INTO DATABASE");

    pstmt.execute();
    pstmt.close();
}
catch (SQLException e) {
    throw new SQLException(e.getMessage());  
}

【问题讨论】:

  • 内容为null或空字符串时是否会出现这种情况?
  • 不,如果我注释掉第四个参数,那么一切正常。
  • 在问题已得到纠正后删除了我的答案...是data non-null?
  • 我的意思是:data 为 null 或空字符串时会发生这种情况吗?
  • 不,如果数据为空则不会发生,只有当字节[]数组中有内容时才会发生

标签: java oracle java-stored-procedures


【解决方案1】:

如果我没记错的话,Oracle JDBC 驱动程序(至少是较旧的驱动程序 - 您没有告诉我们您使用的是哪个版本)不支持 setBytes()(或 getBytes())。

根据我的经验,使用setBinaryStream() 更加可靠和稳定:

InputStream in = new ByteArrayInputStream(data);
pstmt.setBinarySream(4, in, data.length);

【讨论】:

  • 这与使用Blob有什么不同?
  • @Goodwine:因为根据我的经验,getBlob()setBlob() 要么没有实现,要么不能正常工作。
【解决方案2】:

试试下面的代码,这应该对你有用:-

Blob blobValue = new SerialBlob(data);
pstmt.setBlob(4, blobValue);

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2023-03-29
    • 2020-06-28
    • 2012-06-17
    • 2015-10-14
    • 1970-01-01
    • 2021-07-15
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多