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

Откуда:
Сообщений: 253
ЗАДАЧА:

Передать из Java - программы в хранимую процедуру BLOB - объект в который записаны
Double числа:

BLOB blob = BLOB.createTemporary ( conn, true, BLOB.DURATION_SESSION );

os = new DataOutputStream( blob.setBinaryStream( 0 ) );

os.writeDouble( 0.0 );

...

В PL/SQL:

procedure load_from_stream( .. ,bstream in out blob )

..

buffer raw(8);
amount binary_integer := 8 ;

DBMS_LOB.open( bstream, DBMS_LOB.lob_readonly );

DBMS_LOB.read( bstream, amount, amount, buffer );



insert into ... values( ..., UTL_RAW.cast_to_number( buffer ) );

В таблицу всегда пишутся значения -1,02020202020201E126

Подскажите пожалуйста как получить корректные значения???
2 мар 07, 12:14    [3852956]     Ответить | Цитировать Сообщить модератору
 Re: Немогу корректно прочитать данные из BLOB...  [new]
igor_dev
Member

Откуда:
Сообщений: 253
!!!Еще момент если пишу не 0 а 1.0 например получаю -3,6620202020201E125, а не
-1,02020202020201E126
Наверно в PL/SQL неверно считываются????
2 мар 07, 12:19    [3852994]     Ответить | Цитировать Сообщить модератору
 Re: Немогу корректно прочитать данные из BLOB...  [new]
igor_dev
Member

Откуда:
Сообщений: 253
Нашел решение:

Для того, чтобы корректно считать ( в хранимиой процедуре ) число в формате NUMBER необходимо его корруктно записать в java BLOB :-))
Это можно сделать используя класс oracle.sql.NUMBER.


oracle.sql.NUMBER num = new oracle.sql.NUMBER( 10.01 );

// корректное представление Oracle NUMBER в байтах:
byte [] b = num.getBytes();

НО для корректного ститывания необходимо:

!!! Первый байт ( который по описанию формата Oracle NUMBER должен содержать знак и степень числа ) записать в конец а остальные в начало.
Для 4-байтового числа это будет выглядеть примерно так:

out.writeByte( b[1] );
out.writeByte( b[2] );
out.writeByte( b[3] );

out.writeByte( b[0] );

ВОПРОС: кто-то знает почему необходимо именно так? Я так понимаю это специфика формата NUMBER. У кого-то есть описание этого формата?
5 мар 07, 11:59    [3862451]     Ответить | Цитировать Сообщить модератору
 Re: Немогу корректно прочитать данные из BLOB...  [new]
Elic
Member

Откуда:
Сообщений: 29991
igor_dev
специфика формата NUMBER. У кого-то есть описание этого формата?
STFF формат внутреннего представления number
5 мар 07, 12:06    [3862514]     Ответить | Цитировать Сообщить модератору
 Re: Немогу корректно прочитать данные из BLOB...  [new]
igor_dev
Member

Откуда:
Сообщений: 253
Elic

В доке первый байт (со знаком и экспонентой), а затем байты мантисы.

Но у меня oracle.sql.NUMBER.getBytes() возвращает массив байт в котором

Этот первый экспотенциальный байт стоит в конце а байты мантисы вначале!!!
Никто не знает в чем прикол?
5 мар 07, 13:27    [3863238]     Ответить | Цитировать Сообщить модератору
 Re: Немогу корректно прочитать данные из BLOB...  [new]
igor_dev
Member

Откуда:
Сообщений: 253
ВСЕ ОК!!! Число пишется корректно первый байт - знак и экспонента а потом мантиса
просто ситывал некорректно ( задал нетот offset )
Всем спасибо!
Тема ЗАКРЫТА!
5 мар 07, 14:29    [3863824]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить