Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Пн Авг 23 2004 09:12 Заголовок сообщения: Проблема с Oracle92 в части DBMS_XMLDOM |
|
|
Вот исходник тестовой процедуры
Код: |
create table aclob (res clob);
|
Код: |
create or replace procedure xmltest is
outDoc dbms_xmldom.DOMDocument;
outNode dbms_xmldom.DOMNode;
curNode dbms_xmldom.DOMNode;
xmlElem dbms_xmldom.DOMElement;
xmlText dbms_xmldom.DOMText;
cnt1 number;
cnt2 number;
outXML clob;
begin
dbms_lob.createtemporary(outXML, cache => true);
outDoc:=dbms_xmldom.newDOMDocument;
dbms_xmldom.setVersion(outDoc, '1.0');
dbms_xmldom.setCharset(outDoc, 'UTF8');
outNode:=dbms_xmldom.makeNode(outDoc);
xmlElem:=dbms_xmldom.createElement(outDoc, 'ROOT_NODE');
curNode:=dbms_xmldom.appendChild(outNode, dbms_xmldom.makeNode(xmlElem));
for cnt1 in 1 .. 100 loop
xmlElem:=dbms_xmldom.createElement(outDoc, 'SUBNODE1');
xmlText:=dbms_xmldom.createTextNode(outDoc, 'Subnode1 number '||cnt1);
curNode:=dbms_xmldom.appendChild(curNode, dbms_xmldom.makeNode(xmlElem));
curNode:=dbms_xmldom.appendChild(curNode, dbms_xmldom.makeNode(xmlText));
curNode:=dbms_xmldom.getParentNode(curNode);
for cnt2 in 1 .. 100 loop
xmlElem:=dbms_xmldom.createElement(outDoc, 'SUBNODE2');
xmlText:=dbms_xmldom.createTextNode(outDoc, 'Subnode2 number '||cnt2);
curNode:=dbms_xmldom.appendChild(curNode, dbms_xmldom.makeNode(xmlElem));
curNode:=dbms_xmldom.appendChild(curNode, dbms_xmldom.makeNode(xmlText));
curNode:=dbms_xmldom.getParentNode(curNode);
curNode:=dbms_xmldom.getParentNode(curNode);
end loop;
curNode:=dbms_xmldom.getParentNode(curNode);
end loop;
dbms_xmldom.writeToClob(outNode, outXML);
insert into aclob (res) values (outXML);
commit;
end xmltest;
|
когда будете запускать скорее всего у вас ничего не получится
зато если уменьшить величину цикла например до 10 в каждой итерации, то все работает
выяснил, что глюк возникает где-то после 512Кб генерируемого XML
причем ошибки могут быть разные, и они не относятся к какой-то конкретной строке
создается впечатление что процессу просто не хватает памяти или чего-то еще.
Очень хочу узнать у кого получится (и каким образом) генерить документ размером до 20МВ таким вот способом.
Заранее спасибо. |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Чт Авг 26 2004 20:15 Заголовок сообщения: |
|
|
Какая ошибка выдается? |
|
Вернуться к началу |
|
 |
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Пт Авг 27 2004 09:02 Заголовок сообщения: |
|
|
ORA-31099: XDB Security Internal Error
плюс иногда просто ругается на неправильные ноды (при всем при этом - выполнив цикл несколько раз на этих же нодах)
ошибка "плавает" по строкам
изменение Java Pool никак не влияет.
на otn посоветовали поставить 9.2.0.4
мне бы хотелось узнать точно сработает ли тестовая процедура на этой версии.
просто запустите ее pls и попробуйте сгенерировать десяток-другой мегабайт XML-пакета. |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Пт Авг 27 2004 20:17 Заголовок сообщения: |
|
|
Запустил. Oracle 9.2.0.5.
Ваш тест, где оба цикла до 100, генерит XML размером 433 К (всего ), поэтому я немного изменил его, задав оба цикла до 1000. И в таблицу писать не стал, а просто возвращал клиенту clob и его размер. И еще добавил FreeDocument() в конце.
Работал он долго (время к сожалению не замерил), но отработал. Получился clob в 44938918 байт (под 43 метра). После завершения статистика показала 501817752 PGA (813965720 max) и 500829056 UGA (столько же max).
Кстати, после того как документ записан в clob и больше не нужен, надо бы вызывать FreeDocument(), а то боюсь так можно сервер положить запросто. А когда временный clob больше не нужен, его тоже надо освобождать (dbms_lob.FreeTemporary). А лучше всего вообще обойтись без временного, и писать XML прямо в таблицу, через локатор. |
|
Вернуться к началу |
|
 |
Antimof
Зарегистрирован: 04.08.2004 Сообщения: 41 Откуда: Тольятти
|
Добавлено: Пн Авг 30 2004 07:47 Заголовок сообщения: |
|
|
Это хорошая новость.
Спасибо за помощь, займусь апгрейдом СУБД. |
|
Вернуться к началу |
|
 |
|