LINUX.ORG.RU

преобразование LOB в oracle

 , lob,


0

1

предистория:
имеется система получающая некий структурированный поток байтов.
Изначально предполагалась только текстовая информация в кодировке KOI7 (подчеркиваю не KOI8! Суть кодировки проста - есть два спецбайта переключателя на кирилицу и на латиницу ).
По ходу дела выясняется что будет также чисто бинарная информация.
В таблице(назовем OLD_TABLE) базы - эта информация хранилась уже преобразованная в NCLOB (поскольку имела размер превышающий NVARCHAR2).
Соорудил аналог, новую табличку (назовем NEW_TABLE) с колонкой BLOB вместо NCLOB.

Но не охото переписывать кучу сопутствующего софта, посему соорудил VIEW OLD_TABLE из NEW_TABLE.

суть: Осталось конвертировать BLOB в NCLOB по спецкодировке.

вопрос: Что лучше :
- соорудить функцию PL/SQL по типу dbms_lob.converttoclob (на мой взгляд не идеал)
- сорудить функцию «pure C» по типу dbms_lob.converttoclob(наиболее реальный вариант)
- соорудить функцию «java» по типу dbms_lob.converttoclob (на мой взгляд не идеал)
- каким то боком, внести свою кодировку(хоть и идеал, но не фантастика ли это?)
Возможно есть ещё какие варианты?

P.S. был бы благодарен за ссылки на примеры
P.P.S. не писал ни разу на java посему ... или примеры или может уйти в доооолгий ящик.

★★★★★

cast no-dashi


у нас тут 200 с гаком ораклов, если чо - ответ наверняка найдётся :-)


согласно моим заметкам /|\ много шансов получить ответ у тебя

Atlant ★★★★★
() автор топика

Есть оочень весомые сомнения, что такая хрень будет работать, поскольку *LOB это очень специфический типа данных. И уж точно это не встанет через функцию во view.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Ну на время эксперимента я соорудил функцию во view вроде пахала.

create or replace
function binary_blobtoclob(v_blob_in in blob)
return nclob is
  v_file_clob           clob;
  v_file_size           integer := dbms_lob.lobmaxsize;
  v_dest_offset       integer := 1;
  v_src_offset         integer := 1;
  v_blob_csid          number := dbms_lob.default_csid;
  v_lang_context     number := NLS_CHARSET_ID ('CL8KOI8R'); ---dbms_lob.default_lang_ctx;
  v_warning            integer;
  v_length               number;
begin

dbms_lob.createtemporary( v_file_clob, true , DBMS_LOB.SESSION);

dbms_lob.converttoclob(v_file_clob,
                       v_blob_in,
                       v_file_size,
                       v_dest_offset,
                       v_src_offset,
                       v_blob_csid,
                       v_lang_context,
                       v_warning);

return TO_NCLOB(v_file_clob);

end;

Atlant ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

это, да, может... Просто пока альтернативных вариантов не вижу.

Atlant ★★★★★
() автор топика

По ходу дела выясняется что будет также чисто бинарная информация.

может проще хранить эту информацию в base64? тогда не надо новых таблиц и не будет никаких преобразований. гнать в base64 можно как в коде, так и через стандартную функцию oracle utl_encode.base64_encode.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

это не упрощает, а скорее усложняет.
Или BLOB в кодировке KOI7.
Или NCLOB в дважды закодированный KOI7 и BASE64.
Хотелось то, не переделывать старые программки. Но вероятно придется.

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Atlant

как знаешь, но я не вижу тут переделок окромя вызова tobase64 на бинарный поток перед конвертированием в koi7.

vtVitus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.