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

Откуда:
Сообщений: 320
Требуется перенести данные из NCLOB (исходное содержимое не превышает 4000 символов) в BLOB, дополнительно преобразовав в UTF8. Таблицы очень большие - хотелось бы сделать наиболее оптимально. Привожу упрощенный код (реально конечно копируется и куча других полей):
INSERT INTO TMessageSource (F_MESSAGESRCID,F_TEXT)
SELECT M.F_MESSAGESRCIDREF,to_blob(utl_raw.cast_to_raw(convert(dbms_lob.substr(M.F_TEXT, 4000), 'UTF8'))) FROM TMessage M 
INNER JOIN TIdIdIdTemp T ON M.F_MESSAGEID=T.F_ID;

Работает змечательно, быстро, но как только встречаются данные более 1000 символов (а это минимум 2000 в UTF8) - имеем ошибку. Не придумал ничего лучше чем использовать цикл на курсоре чтобы дописывать все что не влезло свыше 1000 первых символов:

INSERT INTO TMessageSource (F_MESSAGESRCID,F_TEXT)
SELECT M.F_MESSAGESRCIDREF,to_blob(utl_raw.cast_to_raw(convert(dbms_lob.substr(M.F_TEXT, 1000), 'UTF8'))) FROM TMessage M 
INNER JOIN TIdIdIdTemp T ON M.F_MESSAGEID=T.F_ID;
BEGIN
   FOR Cur IN (SELECT M.F_MESSAGESRCIDREF, M.F_MESSAGEID, M.F_TEXT FROM TMessage M 
   INNER JOIN TIdIdIdTemp T ON M.F_MESSAGEID=T.F_ID WHERE dbms_lob.getlength(M.F_TEXT) > 1000) LOOP 
   SELECT F_TEXT INTO dest_lob FROM TMessageSource WHERE F_MESSAGESRCID=Cur.F_MESSAGESRCIDREF FOR UPDATE;
   DBMS_LOB.APPEND(dest_lob, to_blob(utl_raw.cast_to_raw(convert(dbms_lob.substr(Cur.F_TEXT, 1000, 1000), 'UTF8'))));
   DBMS_LOB.APPEND(dest_lob, to_blob(utl_raw.cast_to_raw(convert(dbms_lob.substr(Cur.F_TEXT, 2000, 1000), 'UTF8'))));
   DBMS_LOB.APPEND(dest_lob, to_blob(utl_raw.cast_to_raw(convert(dbms_lob.substr(Cur.F_TEXT, 3000, 1000), 'UTF8'))));
END LOOP;   
COMMIT;

Мне как-то очень ненравится этот второй вариант (в частности, нет ли в нем ошибок?), может быть есть другие, более правильные и быстрые способы?
7 фев 11, 14:54    [10196950]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация NCLOB to BLOB  [new]
-2-
Member

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

обернуть процедуру CONVERTTOBLOB в функцию.
7 фев 11, 15:04    [10197041]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация NCLOB to BLOB  [new]
Finder
Member

Откуда:
Сообщений: 320
-2-
обернуть процедуру CONVERTTOBLOB в функцию


Ты имеешь ввиду завернуть в хранимку фактически целиком код из второго примера?
8 фев 11, 06:46    [10199869]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация NCLOB to BLOB  [new]
Finder
Member

Откуда:
Сообщений: 320
Сразу не догадался - речь о DBMS_LOB.CONVERTTOBLOB()!
Спасибо, все заработало (в отличие от моего корявого первоначального варианта).
8 фев 11, 09:04    [10200022]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить