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

Откуда:
Сообщений: 117
Вводная: Есть БД в которую пользователи сохраняют Вордовые файлы в формате rtf.
Хранится это в виде blob объектов. У ворда есть "замечательное" свойство, в тело документа записывать метафайлы (битмэпы) картинок. И если не указать в реестре (чего по умолчанию не сделано) что HKEY_CURRENT_USER > Software > Microsoft > Office > [Version] > Word > Options > ExportPictureWithMetafile = 0
то получается значительный прирост хранимых данных.
Наблюдал до 4-х гигабайт! То что эти файлы не удаляются процедурой очистки устаревших - другой вопрос.
Основной вопрос, можно ли из тела rtf вычленить метахрень (тэги или ещё что) и удалить этот блок.
типа так:
{ftf failo}
{asdf}bla bla bla
{metafile},/,/,.lskdl,Ad,.v,?,asd.,f'123e,.,<{metafile}
{ftf failo end}
вычленить и удалить кусочек от тэга до тэга.
31 дек 10, 14:15    [10025972]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
maximand,

удивление вызывает Blob. зачем в бинарном виде хранить документ в текстовом формате?
а найти фрагмент и удалить - это, разумеется, можно.
начните с instr
31 дек 10, 14:32    [10026001]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
maximand
Member

Откуда:
Сообщений: 117
orawish
maximand,

удивление вызывает Blob. зачем в бинарном виде хранить документ в текстовом формате?
а найти фрагмент и удалить - это, разумеется, можно.
начните с instr

То что это блоб причуда разработчика.
вот пример, я создал файл с таким излишеством как метаданные. Затем в фарманагере изменил блок

{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0

\picw14261\pich9525\picwgoal8085\pichgoal5400\wmetafile8\bliptag494327324{\*\blipuid 1d76d61c6efb1b299e5f72cc532dd833}

--------------

}}}
минусами я заменил несколько килобайт всякой ascii фигни. На внешний вид документа это не повлияло. Но он уменьшился на 200 килобайт.
31 дек 10, 14:42    [10026020]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
yvoinov
Member

Откуда:
Сообщений: 76
Хранение текстов в блобе - совсем не обязательно причуда разработчика. К этому могут быть весьма веские причины. Например, хранение в одном столбце разнотипных блобов - текстов, структурированных документов, картинок - и с необходимостью иметь на все это один контекстный индекс для поиска только в текстовых документах.

Пример - CMS веб-портала с хранением всего контента - гипертекста и имиджей - в одной табличке. Только не надо говорить, что это извращение. Томас считает так и я для разнообразия с ним согласен. ;)

PS. BTW - мне приходилось строить системы подобным образом. Работает весьма шустро. Так что не причуда это вовсе.
9 янв 11, 14:59    [10045043]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
maximand
Member

Откуда:
Сообщений: 117
Как я и подозревал есть проблема.
Видимо, нужно делать всё через некий буфер, казмер которого ограничен 32к.
Конструкция такого вида не работает.
declare 
b_file blob;
b number;
begin
  for i in (select resv_name_id from RESV_CUSTOMIZE_CONF_LETTER rc )
  loop

 select dbms_lob.instr (rc.conf_letter,utl_raw.cast_to_raw('{\nonshppict{\pict\'))-1 into b from RESV_CUSTOMIZE_CONF_LETTER rc where rc.resv_name_id=i.resv_name_id;
 if b>0 then 
 select dbms_lob.substr(rc.conf_letter, b ,1) --Если значение b будет больше определённой величины, то не работает 
 --||utl_raw.cast_to_raw('}{')
 --||dbms_lob.substr(rc.conf_letter, 110949 /*dbms_lob.instr (rc.conf_letter,utl_raw.cast_to_raw('}}}{'))+4*/ ) 
 into b_file from RESV_CUSTOMIZE_CONF_LETTER rc where rc.resv_name_id=i.resv_name_id; 
 update RESV_CUSTOMIZE_CONF_LETTER rc set rc.conf_letter=b_file where rc.resv_name_id=i.resv_name_id; 
 DBMS_OUTPUT.put_line(b||'updated '|| i.resv_name_id );
  end if;

  commit;
  end loop;
end;

Если я вместо b укажу явно 1000 то получаю некий набор из 1000 байт, а напишу 2000 то ошибка:
06502. 00000 - "PL/SQL: numeric or value error%s"
12 янв 11, 14:36    [10059779]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
-2-
Member

Откуда:
Сообщений: 15330
maximand
Видимо, нужно делать всё через некий буфер, казмер которого ограничен 32к
FUNCTION SUBSTR RETURNS RAW
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 LOB_LOC                        BLOB                    IN
 AMOUNT                         NUMBER(38)              IN     DEFAULT
 OFFSET                         NUMBER(38)              IN     DEFAULT
12 янв 11, 14:40    [10059820]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
maximand
Member

Откуда:
Сообщений: 117
Намёка, простите, не понял
12 янв 11, 14:47    [10059901]     Ответить | Цитировать Сообщить модератору
 Re: Обработка BLOB  [new]
-2-
Member

Откуда:
Сообщений: 15330
maximand,

То, что делает твой код можно сделать без неявной конвертации возвращаемого функцией raw в переменную типа blob - функцией trim. Для исходной же задачи - удаления фрагмента - лучше подходит fragment_delete.
12 янв 11, 15:13    [10060166]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить