CLOB值在java端变成空

Posted

技术标签:

【中文标题】CLOB值在java端变成空【英文标题】:CLOB value turn into empty in java side 【发布时间】:2017-12-28 11:00:00 【问题描述】:

我想获取数据类型为 CLOB 的列的值。在 Java 方面,我得到了结构的属性,这些属性来自我们称为“get_val”的过程。 attr[4] 为空,尽管过程不返回空。它适用于某些 CLOB 属性,但有时会返回空属性。 我确信它是空的,因为当我尝试发送 attr[4] 的长度时。它显示“0”。但从程序来看,它显示了 38 个符号。

这可能是什么原因?我该如何解决?

public ValueEntity getAttributeValue(String token, Long objectId, Integer attrId, Date bankDate) throws SQLException, IOException
    try    
        createContext(token,true);

        ocstmt.close();

        ocstmt = (OracleCallableStatement) oracleConnection.prepareCall(" ? = call package.get_val(?,?,?) ");
        ocstmt.registerOutParameter(1, OracleTypes.STRUCT, "T_VAL");
        setLong(2, objectId);
        setInt(3, attrId);
        setDate(4, bankDate);

        ocstmt.setQueryTimeout(200);

        ocstmt.execute();

        return DBUtil.ComplexTypeMapping.getValueEntity(oracleConnection, (Struct)ocstmt.getObject(1));
    finally
        releaseAllResources(false);
    




   public static ValueEntity getValueEntity(OracleConnection connection, Struct struct) throws SQLException, IOException
        if(struct == null) return null;
        Object[] attrs = struct.getAttributes();
        ValueEntity data = new ValueEntity();
        data.setType(bigdecimalAsInteger((BigDecimal)attrs[0]));
        data.setNum(bigdecimalAsDouble((BigDecimal)attrs[1]));
        data.setStr(attrs[2] != null?String.valueOf(attrs[2]):null);
        data.setDate((Date)attrs[3]);

        //Clob clobAttr= (Clob)attrs[4];
        //long clobLength= clobAttr.length();
        //data.setClob( String.valueOf(clobLength));
        data.setClob(getClobAsString((Clob)attrs[4]));


        data.setNumArr(getDoubleArray((Array)attrs[5]));
        data.setStrArr(getStringArray((Array)attrs[6]));
        data.setDateArr(getDateArray((Array)attrs[7]));
        return data;
    

【问题讨论】:

能否请您显示您的程序和 ValueEntity 类的代码? 可能你必须区分包含 NULL 和包含 empty CLOB 的 CLOB 列(即长度为零的 CLOB)这两种情况是绝对不一样。 当我发送 toString 值时,它显示哈希码,这意味着它不为空。它将 CLOB 获取为空值:/ 【参考方案1】:

最后我发现问题与 IBM websphere 版本有关。它是 10.0.0.3 但现在我们使用的是 10.0.0.9 版本。

【讨论】:

以上是关于CLOB值在java端变成空的主要内容,如果未能解决你的问题,请参考以下文章

DB2中如何将一个clob类型的字段改为varchar类型

kettle字段改为空

java中的Blob与Clob的讲解

java Clob类型 转String

DBunit 生成 java.lang.ClassCastException:尝试加载 CLOB 字段时无法将 java.lang.String 强制转换为 oracle.sql.CLOB

原创使用Java进行Clob转String字符串