1

好的,我们开始...

我正在尝试调用存储过程 (PL/SQL),其中一个参数是 blob,但是当我执行 OracleCallableStatement 时出现此错误:

java.sql.SQLException:数据大小大于此类型的最大大小

这太令人沮丧了。。

我尝试执行以下操作但失败了...

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);

我得到同样的错误:

oracleCallableStatement.setBytes(3, someByteArray);

我还更改了 oracle 驱动程序,因为我阅读了这样的网页:

http://www.coderanch.com/t/457770/JDBC/databases/java-sql-sqlexception-data-size

说有bug,我更新到ojdbc5.jar 来自:http ://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

但问题一直存在

数据库是 Oracle 11g JavaEE 是 1.5,在 Glassfish 2.1 中运行

好吧,我想就是这样,我的 someByteArray 不大于 4Gb!它的长度为 38678

编辑:异常在执行之前触发..当我为 OracleCallableStatement 设置属性时触发

堆栈跟踪的一部分:

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:103)
at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2484)
at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1224)
at oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(OraclePreparedStatement.java:2710)

编辑

所以,你好,我要把它放在这里……告诉我我是否做错了,我会删除它……

someByteArray 是从 someString.toByteArray() 获取的数组

该字符串持有以 Base64 编码的(编辑:用于说 jpeg)PNG 图像的表示...

所以,我在 sun.misc.BASE64Decoder 中使用了一个方法从 someString 中获取 someByteArray ... 然后我使用了

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);

它就像一个魅力..

BUUUT...不建议使用 sun.misc 中的类,请阅读此内容以获取更多信息。

工作 sun.misc.BASE64Encoder/Decoder 以获取字节 []

但!!!

这并不能解决为什么我无法将第一个字节数组放入参数中的奥秘以及神秘异常“java.sql.SQLException:数据大小大于此类型的最大大小”的奥秘......

编辑:

这个错误再次出现......这次一切都很好,我正确解码了base64,但是“java.sql.SQLException:数据大小大于这种类型的最大大小”一直返回......

编辑:

它是驱动程序,我在服务器和应用程序上更改它,然后我重新部署并且一切正常......

4

2 回答 2

1

不是答案

您不能(正确地)将图像的字节保留在字符串中。您可以首先将byte[]使用 Base64 编码为字符串。也许虽然我误解了,但你做得对。检查您是否记录了每个异常。

除了已弃用的 sun 版本(并非在每个 JDK 中都可用)之外,还有其他一些 Base64 转换。在 JavaEE 中:

import javax.xml.bind.DatatypeConverter;
String data = "...";
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
String data = DatatypeConverter.parseBase64Binary(bytes);

您不能将数据存储为二进制 blob,而不使用 base64 编码吗?至少可以节省空间。

另一个错误可能是重复使用的 ByteArray 或其他一些微不足道的错误。

于 2013-03-01T17:15:13.520 回答
1

原来是驱动程序,正如我在问题中所述,我更改为 ojdbc5.jar,并且我必须确保 Web 服务器选择了正确的驱动程序而不是旧的驱动程序,正如 Alex Poole 所指出的那样,问题解决了。

于 2013-04-17T19:00:35.047 回答