如何从Oracle中已用Java压缩的BLOB列中提取XML文档

如何从Oracle中已用Java压缩的BLOB列中提取XML文档,oracle,blob,compression,Oracle,Blob,Compression,我在Oracle11G11.1中有一个表,它有一个包含XML文档的BLOB列 XML文档已使用java程序写入表中,并已使用java.util.zip deflator序列化和压缩 是否有一种简单的方法可以使用SQL或PLSQL来提取此文档,以反转用于创建BLOB列以获取原始XML文档的过程 我从一个web应用程序中识别了一段java,该应用程序读取的列看起来像下面的代码,但出于支持目的,希望能够从后端访问列数据 private IntegrationStagingDataBean fromOb

我在Oracle11G11.1中有一个表,它有一个包含XML文档的BLOB列

XML文档已使用java程序写入表中,并已使用java.util.zip deflator序列化和压缩

是否有一种简单的方法可以使用SQL或PLSQL来提取此文档,以反转用于创建BLOB列以获取原始XML文档的过程

我从一个web应用程序中识别了一段java,该应用程序读取的列看起来像下面的代码,但出于支持目的,希望能够从后端访问列数据

private IntegrationStagingDataBean fromObjectToBean(StagedMessage message) throws ServerException {
    IntegrationStagingDataBean bean = new IntegrationStagingDataBean();
    bean.setBusinessId(message.getBusinessId());
    bean.setBusinessType(message.getBusinessType());
    bean.setCreateTime(message.getCreateTime());
    bean.setDeleted(message.hasBeenDeleted() ? "Y" : "N");
    bean.setErrorMessage(message.getErrorMessage());
    bean.setId(message.getId());
    bean.setStoreId(message.getStoreId());
    bean.setMessageDirection(message.getMessageDirection().getDbCode());
    bean.setMessageFamily(message.getMessageFamily().getDbCode());
    bean.setMessageType(message.getMessageType().getDbCode());
    bean.setProcessed(message.hasBeenProcessed() ? "Y" : "N");
    bean.setRetryCount(message.getRetryCount());
    bean.setUpdateTime(message.getUpdateTime());
    try {
        bean.setSerializedDeo(ObjectUtils.toByteArray(new CompressedObject(message.getDeo())));
    } catch (IOException ioex) {
        throw new ServerException("Problem setting compressed serialized object", ioex);
    }
    return bean;
}

private StagedMessage fromBeanToObject(IntegrationStagingDataBean bean) throws ServerException {
    DataExchangeObject deo = null;
    Blob blob = (Blob) bean.getSerializedDeo();
    try {
        CompressedObject compressedObject = (CompressedObject) new              
              ObjectInputStream(blob.getBinaryStream()).readObject();
        deo = (DataExchangeObject) compressedObject.recoverObject();
    } catch (Exception e) {
        throw new ServerException("Couldn't uncompress/deserialize DEO from BLOB", e);
    }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

并发现以下附加函数分布在几个包中,这些包表明它正在使用java.util.zip.*中的java函数deflater

公共压缩对象对象 抛出IOException { dataToSend=null; ifobject!=null dataToSend=ObjectUtils.toCompressedByteArrayobject; }


提前感谢。

为什么有人要序列化XML文档?这是一个来自Oracle的封闭应用程序,过去它直接将数据发送到JMS队列,但现在,在最新版本中,他们将其解耦,以便将其写入包含此blob列(包含消息数据)的暂存表。这是为了允许客户端使用自己的消息传递系统。可能压缩和序列化是它发送XML消息数据的旧方法的遗留,因此如果他们将其放在CLOB中会更好,但不幸的是,我们无法控制它。我想这取决于它是如何压缩的。Oracle内置了一些包来进行gzip压缩和解压缩,我在过去使用过这些包。如果Java使用gzip,那么Oracle应该能够使用PLSQL对其进行解压缩。如果不是gzip,您可以创建一个独立的Java存储过程来完成与Java代码相同的工作。我添加了一些更详细的信息-似乎是使用Java.utils.zip deflate来压缩数据,这意味着它是zlib压缩。是否要使用PLSQL反序列化并解压缩?
public static final byte[] toCompressedByteArray(Object o)
    throws IOException
{
    return compressByteArray(toByteArray(o));
}

public static final byte[] compressByteArray(byte input[])
{
    Deflater compressor = new Deflater(9);
    compressor.setInput(input);
    compressor.finish();
    ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);
    byte buf[] = new byte[1024];
    int count;
    for(; !compressor.finished(); bos.write(buf, 0, count))
        count = compressor.deflate(buf);

    try
    {
        bos.close();
    }
    catch(IOException e) { }
    return bos.toByteArray();
}

public static final byte[] decompressByteArray(byte arr[])
{
    Inflater decompressor = new Inflater();
    decompressor.setInput(arr);
    ByteArrayOutputStream bos = new ByteArrayOutputStream(arr.length);
    byte buf[] = new byte[1024];
    while(!decompressor.finished()) 
        try
        {
            int count = decompressor.inflate(buf);
            bos.write(buf, 0, count);
        }
        catch(DataFormatException e) { }
    try
    {
        bos.close();
    }
    catch(IOException e) { }
    return bos.toByteArray();
}