商店从Java到BD的Blob:数据尺寸比最大尺寸更大的这种类型时,显然是不

问题描述:

好了,在这里我们去...商店从Java到BD的Blob:数据尺寸比最大尺寸更大的这种类型时,显然是不

我试图调用存储过程(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

说,有一个错误,我更新了它ojdbc5.jar 来源:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

但问题是持久

的DB是一个的Oracle 11g JavaEE的是1.5英寸的Glassfish 2.1

跑得好,我想这是它,我someByteArray不大于4GB的!它具有38678

EDIT的长度: 例外的是执行之前击发..它触发当我设置为堆栈跟踪的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) 

EDIT

所以,大家好,去把这个在这里......告诉我,如果I'm做错了,我会删除它...

someByteArray是一个数组,它是从someString.toByteArray()

该字符串举着(编辑:常说的JPEG)的表示得到的Base64 PNG图像编码...

所以,我用于sun.misc.BASE64Decoder的方法从someString获得someByteArray ... 然后我用

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

和它的工作就像一个魅力..

BUUUT ...的 用法sun.misc中的类不推荐,阅读以获取更多信息..

work sun.misc.BASE64Encoder/Decoder for getting byte[]

BUT!

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

编辑:

此错误再次出现......这个时候一切都还好,我是正确解码的base64,但“值java.sql.SQLException:数据大小比为这种类型的最大尺寸更大的”不断回...

编辑:

正是那个司机,我改变它的服务器和应用程序,并重新部署我,一切都工作得很好......

+0

此外,这看起来像一个或多或少的常见错误: https://forums.oracle.com/forums/thread.jspa?messageID=9863886 http://dbaspot.com/oracle-server/68540-java -sql-sqlexception-greater-type-length-than-maximum.html – jsedano 2013-02-13 17:49:31

+1

你确定Glassfish是否正在购买更新的驱动程序 - 它没有一个优先级较高的驱动程序? – 2013-02-13 18:07:49

+0

是的,我仔细检查。 – jsedano 2013-02-13 18:14:03

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

没有答案

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

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

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

不能将数据存储为二进制blob,没有base64编码?它至少可以节省空间。

其他错误可能会增加重用ByteArray或其他一些微不足道的错误。

+0

我编辑我的帖子,这是一个PNG图像不是JPEG,并且,我正确解码从base64到字节数组... – jsedano 2013-03-01 17:20:38

+0

啊,图像是在Base64 (如表单上传)。所以我的回答没那么有用。给了一个长度? 'BLOB(102400)'?虽然4GB是最大的,但我认为有2GB的默认值。 – 2013-03-01 17:31:28