Немогу корректно прочитать данные из BLOB...

igor_dev
Дата: 02.03.2007 12:14:59
ЗАДАЧА:

Передать из 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

Подскажите пожалуйста как получить корректные значения???
igor_dev
Дата: 02.03.2007 12:19:36
!!!Еще момент если пишу не 0 а 1.0 например получаю -3,6620202020201E125, а не
-1,02020202020201E126
Наверно в PL/SQL неверно считываются????
igor_dev
Дата: 05.03.2007 11:59:02
Нашел решение:

Для того, чтобы корректно считать ( в хранимиой процедуре ) число в формате 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. У кого-то есть описание этого формата?
Elic
Дата: 05.03.2007 12:06:53
igor_dev
специфика формата NUMBER. У кого-то есть описание этого формата?
STFF формат внутреннего представления number
igor_dev
Дата: 05.03.2007 13:27:33
Elic

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

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

Этот первый экспотенциальный байт стоит в конце а байты мантисы вначале!!!
Никто не знает в чем прикол?
igor_dev
Дата: 05.03.2007 14:29:32
ВСЕ ОК!!! Число пишется корректно первый байт - знак и экспонента а потом мантиса
просто ситывал некорректно ( задал нетот offset )
Всем спасибо!
Тема ЗАКРЫТА!