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. У кого-то есть описание этого формата?
igor_dev
Дата: 05.03.2007 13:27:33
Elic
В доке первый байт (со знаком и экспонентой), а затем байты мантисы.
Но у меня oracle.sql.NUMBER.getBytes() возвращает массив байт в котором
Этот первый экспотенциальный байт стоит в конце а байты мантисы вначале!!!
Никто не знает в чем прикол?