【问题标题】:Java Oracle oracle.sql.ARRAY errorsJava Oracle oracle.sql.ARRAY 错误
【发布时间】:2019-10-27 21:12:07
【问题描述】:

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

这次我在数组中加入了blob类型:

create or replace type My_ARRAY AS object(
_ID  NUMBER(10),
DOCUMNT blob) 

在创建 ArrayDescriptor 并在 java 类中我使用 InputStreamjava.sql.Blob 也是)调用

new ARRAY(varcharAdd, getConnection(), addArray);

它发现一个错误,在调试模式下e.printStackTrace(); 显示 ASCII 系统代码,我的系统开始发出声音:围兜。 对于 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 阵列并面临这种问题。

【问题讨论】:

  • 请也分享您的异常堆栈跟踪。
  • 我刚刚编辑了我的问题。请检查

标签: java sql arrays oracle


【解决方案1】:

问题正是我们在流中写入的 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);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多