Java Oracle Oracle.sql.ARRAY错误

Java Oracle Oracle.sql.ARRAY错误,java,sql,arrays,oracle,Java,Sql,Arrays,Oracle,我在OracleDB中使用数组并调用CallableStatement来执行存储过程 这次我在数组中包含了blob类型: create or replace type My_ARRAY AS object( _ID NUMBER(10), DOCUMNT blob) 创建ArrayDescriptor之后,在java类中,我使用了InputStream(java.sql.Blob)调用 它在调试模式e.printStackTrace()中捕获错误显示ASCII系统代码,我的系统开始发出声音

我在OracleDB中使用数组并调用CallableStatement来执行存储过程

这次我在数组中包含了blob类型:

create or replace type My_ARRAY AS object(
_ID  NUMBER(10),
DOCUMNT blob) 
创建ArrayDescriptor之后,在java类中,我使用了InputStreamjava.sql.Blob)调用

它在调试模式
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)
java.sql.SQLException:无法转换为内部表示:javax.sql.rowset.serial。SerialBlob@d316ee
位于oracle.jdbc.oracore.OracleTypeBLOB.toDatum(OracleTypeBLOB.java:71)
位于oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:723)
位于oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1298)
位于oracle.sql.STRUCT.(STRUCT.java:167)
位于oracle.sql.OracleSQLOutput.getSTRUCT(OracleSQLOutput.java:125)
位于oracle.sql.STRUCT.toSTRUCT(STRUCT.java:502)
位于oracle.jdbc.oracore.OracleTypeADT.toDatum(OracleTypeADT.java:329)
位于oracle.jdbc.oracore.OracleTypeADT.toDatumArray(OracleTypeADT.java:373)
位于oracle.jdbc.oracore.OracleTypeUPT.toDatumArray(OracleTypeUPT.java:110)
位于oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1240)
位于oracle.sql.ARRAY.(ARRAY.java:103)

任何人使用blob Oracle阵列都会遇到这种问题。

问题恰恰是我们在流中写入的blob类型,InputStreamjava.sql.blob不正确,我们必须使用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);
            }
        }
    }

请分享你的异常堆栈跟踪。我刚刚编辑了我的问题。请查收
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);
            }
        }
    }