Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование CLOB -> XMLType, ... 
:(
    Опции темы
Plamenk
Дата 4.7.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Всем Привет!

Наткнулся на очень странную ошибку, при преобразовании CLOB -> XMLType в Oracle9i.

У меня есть ХП, куда передается CLOB, который преобразуется следующим кодом в XMLType

Код

XMLType(xmlNew)


Это преобразование иногда работает нормально, а иногда вылетает (так происходит ошибка, когда XML больше 32KB).

И что самое интересное - это лечится следующим кодом

Код

    insert into tmp_clob(data) values (xmlUpd);
    select data into xmlTemp from tmp_clob;
    DELETE FROM tmp_clob;

    XMLType(xmlTemp )


Вопрос: Как решить эту проблему без использования преведенного выше кода?
И из-за чего может возникать данная ошибка?

Заранее Все БОЛЬШОЕ СПАСИБО!

Это сообщение отредактировал(а) Plamenk - 4.7.2005, 11:11
PM MAIL   Вверх
VIAcom
Дата 4.7.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 2.5.2005
Где: г. Казань, Емноно вский Хутор.

Репутация: нет
Всего: нет



Plamenk
О у меня была походу такая проблема но когда я читал из CLOB в файл. Собственно это связано с тем, что видимо нельзя обработать сразу весь LOB, а делать это надо по кусочкам не знаю чем вызвано ограничение именно в 1/2 сегмента - Length:=32767;

не уверен, но надеюсь что поможет ...
... нет почти наверняка не поможет


Это сообщение отредактировал(а) VIAcom - 4.7.2005, 16:28
PM MAIL ICQ   Вверх
LSD
Дата 4.7.2005, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(VIAcom @ 4.7.2005, 17:02)
ограничение именно в 1/2 сегмента - Length:=32767

Это скорее ограничение не 1/2 сегмента, а длинны VARCHAR2 в PL/SQL.

Plamenk
Я полагаю надо работать через DBMS_LOB.CREATETEMPORARY, хотелось бы посмотреть весь код процедуры.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Plamenk
Дата 5.7.2005, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Спасибо за ответы! Привожу полный текст процедуры:
В данном варианте она всегда нормально отрабатывает, но на мой взгляд должен быть более простой способ преобразования CLOB в XMLType:

Код

CREATE OR REPLACE Procedure hrp_UpdateBatchValuePri(
  xmlUpd IN  CLOB,
  xmlNew OUT CLOB,
  RowCount OUT INTEGER,
  ReturnCode OUT INTEGER
) as

  domBatch dbms_xmldom.DOMDocument;
  nlBatch dbms_xmldom.DOMNodelist;
  ndBatch dbms_xmldom.DOMNode;
  elBatch dbms_xmldom.DOMElement;

  vaction number;
  id number;
  prg_npar number;
  psp_npos number;
  val varchar2(120);
  display_value varchar2(120);
  pri_nomer number;
  xmlTemp clob;

BEGIN

  ReturnCode := 0;
  RowCount := 0;
  
 --Следующие 3 строки были созданы из-за возникновения ошибки,
  --которая возникает при передаче CLOB'а напрямую в DOMDocument,
  --если длина CLOB'а больше 32K.
  
  if (LENGTHB(xmlUpd) >= 32768) then
    insert into tmp_clob(data) values (xmlUpd);
    select data into xmlTemp from tmp_clob;
    DELETE FROM tmp_clob;
    
    domBatch:=dbms_xmldom.newDOMDocument(XMLType(xmlTemp));
  else
    domBatch:=dbms_xmldom.newDOMDocument(XMLType(To_CHAR(xmlUpd)));
  end if;

     nlBatch:=dbms_xmldom.getChildNodes(dbms_xmldom.item(dbms_xmldom.getElementsByTagName(domBatch, 'ValuePri') ,0));
     for Itm in 1..dbms_xmldom.getLength(nlBatch) loop

         ndBatch:=dbms_xmldom.item(nlBatch,Itm-1);
         elBatch := dbms_xmldom.makeElement(ndBatch);
         vaction:=dbms_xmldom.getAttribute(elBatch,'action');

         if vaction=1 then
--******************Добавление**************************************

             prg_npar:=dbms_xmldom.getAttribute(elBatch,'prg_npar');
             psp_npos:=dbms_xmldom.getAttribute(elBatch,'psp_npos');
             val:=dbms_xmldom.getAttribute(elBatch,'value');
             display_value:=dbms_xmldom.getAttribute(elBatch,'display_value');
             pri_nomer:=dbms_xmldom.getAttribute(elBatch,'pri_nomer');
             
             INSERT INTO VALUEPRI (ID, PRG_NPAR, PSP_NPOS, VALUE, DISPLAYVALUE, PRI_NOMER) VALUES
             (VALUEPRI_ID_SEQ.NEXTVAL, prg_npar, psp_npos, val, display_value, pri_nomer);
             
             SELECT VALUEPRI_ID_SEQ.CURRVAL INTO id FROM DUAL;
             
             dbms_xmldom.setAttribute(elBatch,'id', id);
             RowCount := RowCount + SQL%ROWCOUNT;
         elsif vaction=2 then
--******************Модификация**************************************
             id := dbms_xmldom.getAttribute(elBatch,'id');
             prg_npar:=dbms_xmldom.getAttribute(elBatch,'prg_npar');
             psp_npos:=dbms_xmldom.getAttribute(elBatch,'psp_npos');
             val:=dbms_xmldom.getAttribute(elBatch,'value');
             display_value:=dbms_xmldom.getAttribute(elBatch,'display_value');
             pri_nomer:=dbms_xmldom.getAttribute(elBatch,'pri_nomer');
             
             UPDATE VALUEPRI v SET
                    v.PRG_NPAR = prg_npar, v.PSP_NPOS = psp_npos,
                    v.VALUE = val, v.DISPLAYVALUE = display_value,
                    v.PRI_NOMER = pri_nomer
                    WHERE v.ID = id;

             RowCount := RowCount + SQL%ROWCOUNT;
         end if;
     end loop;
     
     dbms_xmldom.writeToClob(domBatch,xmlNew);
     EXCEPTION WHEN OTHERS THEN ReturnCode := sqlcode;
END;

PM MAIL   Вверх
smolbars
Дата 23.10.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



А как победить подобную же проблему если использовать не dom а xsu и надо перегонять xml в файл
а то у меня строки километровые
вот тут мой топик
там описано в чем проблема
В принципе (и без принципа тоже) это та же проблема что и у VIAcom
Но что то по кускам у меня не получается - может за это время VIAcom нашел решение
Я конечно написал альтернативный вариант на delphi но с клиентского мется меня как-то не плющит такое делать - просто время поджимало
Может кто подскажет как обойти это ограничение 32767
smile
PM MAIL   Вверх
Кану
Дата 2.11.2005, 08:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как вариант такой обход:

Код


ttt clob := null;
begin

DBMS_LOB.createtemporary(ttt,true);
DBMS_LOB.open(ttt,1);
DBMS_LOB.append(ttt,aaa));

end;


где ttt - понятно что, а
ааа - clob храняший наши данные, но не желающий вернуть их целиком. "ааа" создавался так же, как и ttt с помощью createtemporary.
Я интереса ради передал там 8 метров. В принципе все это дело работает, но вопрос - насколько нужен такой объем инфы... Для получения данных всетаки, больше подойдет считывание по кускам, если нет желания заставить комп подавиться обилием инфы.

Пробуйте.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.