Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 сжатие clob + java = проблема с кодировкой.  [new]
Tikkanen
Member

Откуда: $ORACLE_HOME
Сообщений: 163
доброго дня!
стала задача уменьшить размер clob поля (храним в нем xml - файлы), в 10 версии такой возможности нет. Воспользовался методом позаимствованным у Т.Кайта.
Все сжимает отлично, но проблема в том, что при декомпрессии нарушается кодировка (кириллица превращается в кракозябры), как решить эту проблему? в джаве я не очень специалист.

Вот исходный код -

create or replace and compile java source named  "LobCompressor" as
import java.lang.*;
import oracle.sql.*;
import java.io.*;
import java.util.zip.InflaterInputStream;
import java.util.zip.DeflaterOutputStream;

/**
 * A simple class for LOB compression and decompression in Oracle Database. Will work in 8i and 
better.
 *
 * @author <a href="mailto:pjarmuz@poczta.onet.pl">Piotr Jarmuz</a>
 */
public class LobCompressor {
/**
 * Compresses the CLOB into BLOB
 *
 * @param clob the source CLOB (plain text)
 * @param blob the target BLOB (will hold compressed binary data) it should be an empty BLOB 
retrieved for example with dbms_lob.createtemporary(l_blob,true);
 * @throws Exception mostly I/O exception if ever
 */
    public static void compress(CLOB clob, BLOB blob) throws Exception {
        InputStream in=clob.getAsciiStream();
        DeflaterOutputStream z=new DeflaterOutputStream(blob.getBinaryOutputStream());
        byte[] buffer=new byte[clob.getBufferSize()];

        int cnt;
        while ((cnt=in.read(buffer))!=-1) {
            z.write(buffer,0,cnt);
        }
        in.close();
        z.close();
    }

/**
 * Decompresses the BLOB into CLOB
 *
 * @param blob the source BLOB (compressed binary data)
 * @param clob the target CLOB (will hold plain text) it should be an empty CLOB retrieved for 
example with dbms_lob.createtemporary(l_clob,true);
 * @throws Exception mostly I/O exception if ever
 */
    public static void decompress(BLOB blob, CLOB clob) throws Exception {
        OutputStream out=clob.getAsciiOutputStream();
        InflaterInputStream z=new InflaterInputStream(blob.getBinaryStream());
        byte[] buffer=new byte[blob.getBufferSize()];

        int cnt;
        while ((cnt=z.read(buffer))!=-1) {
            out.write(buffer,0,cnt);
        }
        z.close();
        out.close();
    }

/**
 * Compresses the BLOB into BLOB
 *
 * @param slob the source BLOB (plain binary data)
 * @param blob the target BLOB (will hold compressed binary data) it should be an empty BLOB 
retrieved for example with dbms_lob.createtemporary(l_blob,true);
 * @throws Exception mostly I/O exception if ever
 */
    public static void compress(BLOB slob, BLOB blob) throws Exception {
        InputStream in=slob.getBinaryStream();
        DeflaterOutputStream z=new DeflaterOutputStream(blob.getBinaryOutputStream());
        byte[] buffer=new byte[slob.getBufferSize()];

        int cnt;
        while ((cnt=in.read(buffer))!=-1) {
            z.write(buffer,0,cnt);
        }
        in.close();
        z.close();
    }

/**
 * Decompresses the BLOB into CLOB
 *
 * @param blob the source BLOB (compressed binary data)
 * @param slob the target CLOB (will hold plain binary data) it should be an empty CLOB retrieved 
for example with dbms_lob.createtemporary(l_blob,true);
 * @throws Exception mostly I/O exception if ever
 */
    public static void decompress(BLOB blob, BLOB slob) throws Exception {
        OutputStream out=slob.getBinaryOutputStream();
        InflaterInputStream z=new InflaterInputStream(blob.getBinaryStream());
        byte[] buffer=new byte[blob.getBufferSize()];

        int cnt;
        while ((cnt=z.read(buffer))!=-1) {
            out.write(buffer,0,cnt);
        }
        z.close();
        out.close();
    }
};
/
create or replace package compressor is
    function clob_compress(p_clob clob) return blob;
    function clob_decompress(p_blob blob) return clob;
    function blob_compress(p_blob blob) return blob;
    function blob_decompress(p_blob blob) return blob;
end;
/

create or replace package body sys_megotest.compressor is

procedure clob_decompress(p_blob blob, p_clob clob)
as language java
name 'LobCompressor.decompress(oracle.sql.BLOB, oracle.sql.CLOB)';

procedure clob_compress(p_clob clob, p_blob blob)
as language java
name 'LobCompressor.compress(oracle.sql.CLOB, oracle.sql.BLOB)';

procedure blob_decompress(p_slob blob, p_blob blob)
as language java
name 'LobCompressor.decompress(oracle.sql.BLOB, oracle.sql.BLOB)';

procedure blob_compress(p_slob blob, p_blob blob)
as language java
name 'LobCompressor.compress(oracle.sql.BLOB, oracle.sql.BLOB)';

function clob_compress(p_clob clob) return blob is
l_blob blob;
begin
     if p_clob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     clob_compress(p_clob,l_blob);
     return l_blob;
end;

function clob_decompress(p_blob blob) return clob is
l_clob clob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_clob,true);
     clob_decompress(p_blob,l_clob);
     return l_clob;
end;

function blob_compress(p_blob blob) return blob is
l_blob blob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     blob_compress(p_blob,l_blob);
     return l_blob;
end;

function blob_decompress(p_blob blob) return blob is
l_blob blob;
begin
     if p_blob is null then
         return null;
     end if;
     dbms_lob.createtemporary(l_blob,true);
     blob_decompress(p_blob,l_blob);
     return l_blob;
end;

end;
/


Ben i need help ()
2 дек 08, 14:11    [6513945]     Ответить | Цитировать Сообщить модератору
 Re: сжатие clob + java = проблема с кодировкой.  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Указывай явно кодировку (как ниже) или передавай ее параметром, и используй Reader/Writer'ы при работе с текстом:

import java.sql.SQLException;
...
public class LobCompressor {
...
  public static void compress (CLOB clob, BLOB blob) throws IOException, SQLException {
    Reader reader = new BufferedReader(clob.getCharacterStream());
    OutputStreamWriter writer = new OutputStreamWriter(
      new DeflaterOutputStream(blob.getBinaryOutputStream()), "UTF8"
    );
    int length;
    char[] buf = new char[clob.getChunkSize()];
    while ((length = reader.read(buf, 0, clob.getChunkSize())) != -1) {
      writer.write(buf, 0, length);
    }
    reader.close();
    writer.close();
  }

  public static void decompress (BLOB blob, CLOB clob) throws IOException, SQLException {
    Reader reader = new InputStreamReader(
      new InflaterInputStream(blob.getBinaryStream()), "UTF8"
    );
    Writer writer = clob.getCharacterOutputStream();

    char[] chars = new char[clob.getChunkSize()];
    int iChar;
    while ((iChar = reader.read(chars)) != -1) {
      writer.write(chars, 0, iChar);
    }
    reader.close();
    writer.close();
  }
...
}
2 дек 08, 16:33    [6515167]     Ответить | Цитировать Сообщить модератору
 Re: сжатие clob + java = проблема с кодировкой.  [new]
Tikkanen
Member

Откуда: $ORACLE_HOME
Сообщений: 163
спасибо Денис. все заработало.
2 дек 08, 17:27    [6515527]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить