Как извлечь документ XML из столбца BLOB в Oracle, который был сжат в Java - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть таблица в Oracle 11G (11.1), в которой есть столбец BLOB, содержащий документы XML.

XML-документ был записан в таблицу с использованием java-программы и был сериализован и сжат с использованием дефлятора java.util.zip.

Есть ли простой способ извлечь этот документ с помощью SQL или PLSQL, чтобы обратить вспять процесс, использованный для создания столбца BLOB, чтобы получить исходный документ XML?

Я идентифицировал часть 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 deflater из java.util.zip. *;

public CompressedObject (Объектный объект) бросает IOException { dataToSend = null; if (object! = null) dataToSend = ObjectUtils.toCompressedByteArray (object); }

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();
}

Заранее спасибо.

...