У меня есть таблица в 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();
}
Заранее спасибо.