我在oracledb中使用数组,并调用CallableStatement来执行存储过程。
这次我在数组中包含了blob类型:
create or replace type My_ARRAY AS object(
_ID NUMBER(10),
DOCUMNT blob)
创建ArrayDescriptor后,在java类中,我使用InputStream(java.sql.Blob也使用)调用
new ARRAY(varcharAdd, getConnection(), addArray);
它发现了一个错误,在调试模式下,e.printStackTrace();
显示ASCII系统代码,我的系统开始发出声音:bib的。对于java.sql.Blob的情况,它抛出以下消息:
java.sql.SQLException: Fail to convert to internal representation: javax.sql.rowset.serial.SerialBlob@d316ee
at oracle.jdbc.oracore.OracleTypeBLOB.toDatum(OracleTypeBLOB.java:71)
at oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:723)
at oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1298)
at oracle.sql.STRUCT.<init>(STRUCT.java:167)
at oracle.sql.OracleSQLOutput.getSTRUCT(OracleSQLOutput.java:125)
at oracle.sql.STRUCT.toSTRUCT(STRUCT.java:502)
at oracle.jdbc.oracore.OracleTypeADT.toDatum(OracleTypeADT.java:329)
at oracle.jdbc.oracore.OracleTypeADT.toDatumArray(OracleTypeADT.java:373)
at oracle.jdbc.oracore.OracleTypeUPT.toDatumArray(OracleTypeUPT.java:110)
at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1240)
at oracle.sql.ARRAY.<init>(ARRAY.java:103)
让任何人使用blob Oracle阵列并面临此类问题。
问题恰恰是我们在流中写入的blob的类型,InputStream和java.sql.BBlob不正确,我们必须使用oracle.sql.blob
public static final void writeBlob(SQLOutput stream, byte[] value) throws SQLException {
if (value != null) {
oracle.sql.BLOB blob = oracle.sql.BLOB.getEmptyBLOB();
blob.setBytes(value);
stream.writeBlob(blob);
} else {
stream.writeObject(null);
}
}
public static final void readBlob(SQLInput stream, InputStream inputStream) throws SQLException {
oracle.sql.BLOB blob = oracle.sql.BLOB.getEmptyBLOB();
blob = (BLOB) stream.readBlob();
if (blob != null) {
byte[] bytes = blob.getBytes();
if (bytes != null) {
inputStream = new ByteArrayInputStream(bytes);
}
}
}