У нас Oracle - 10.2.0.2.0
O/S: Linux 2.6.9-22.ELsmp #1 i686 i386 GNU/Linux Хочу добавить node при помощи DBMS_XMLDOM.appendChild
Мой код:
DECLARE
d dbms_xmldom.DOMDocument;
c dbms_xmldom.DOMDocument;
dn dbms_xmldom.DOMNode;
cn dbms_xmldom.DOMNode;
doc CLOB;
child CLOB;
BEGIN
/*
valiable doc =
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TicketMessage>
<Header>DDDD </Header>
</TicketMessage>
*/
SELECT struct INTO doc FROM tab;
d := dbms_xmldom.newDOMDocument(doc);
dn := dbms_xmldom.makeNode(d);
dn := dbms_xmldom.getFirstChild(dn);
/*
valiable child =
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Body>
<A>sssss</A>
</Body>
*/
SELECT struct INTO child FROM tab2;
c := dbms_xmldom.newDOMDocument(child);
cn := dbms_xmldom.makeNode(c);
cn := dbms_xmldom.getFirstChild(cn);
dn := dbms_xmldom.appendChild(dn, cn);
END;
-------------------------------------
На Oracle 9i все нормально работает
На Oracle 10g (10.2.0.2.0) дает ошибку
ORA-31185: DOM Nodes do not belong to the same DOM Document
на строке dn := dbms_xmldom.appendChild(dn, cn);
На oracle/metalink нашла описание бага: Bug No. 4655347:
ORA-31185: DOM NODES DO NOT BELONG TO THE SAME DOM DOCUMENT
The error is valid. - x_target_node := dbms_xmldom.appendChild(x_target_node, ndoc); fails with ORA-31185 becuase x_target_node originates from x_doc_in whereas ndoc originates from x_doc. . DOMDocuments x_doc_in and x_dox were created from separate calls to dbms_xmldom.newDOMDocument
Solution:
Basically the change requirement is that - to avoid the ORA-31185:, using dbms_xmldom.importNode(x_doc_in, ndoc, TRUE);
Но еслим модифицировать код:
С:
c := dbms_xmldom.newDOMDocument(child);
cn := dbms_xmldom.makeNode(c);
cn := dbms_xmldom.getFirstChild(cn);
dn := dbms_xmldom.appendChild(dn, cn);
На:
c := dbms_xmldom.newDOMDocument(child);
cn := dbms_xmldom.makeNode(c);
cn := dbms_xmldom.getFirstChild(cn);
import_node := dbms_xmldom.importNode(c,cn,TRUE);
dn := dbms_xmldom.appendChild(dn, import_node);
Ничего не меняется - получаю туже ошибку
ORA-31185: DOM Nodes do not belong to the same DOM Document