Using xmldom.freeDocument

Oracle 8.1.7, PL/SQL
I wrote a function to return a node list from a clob. The code is as follows:
FUNCTION fcn_Get_Node_List (
p_clobXML clob,
p_vcPath VARCHAR2) RETURN sys.xmldom.DOMNodelist AS
v_docParse xmldom.DOMDocument;
v_nlNodeList xmldom.DOMNodeList;
v_nodNode xmldom.DOMNode;
v_prsParser xmlparser.parser;
v_vcValue VARCHAR2 (1000);
BEGIN
v_prsParser := xmlparser.newParser;
xmlparser.parseClob (v_prsParser, p_clobXML);
v_docParse := xmlparser.getDocument (v_prsParser);
v_nlNodeList := xslprocessor.selectNodes (xmldom.makeNode(v_docParse), p_vcPath);
xmldom.freeDocument (v_docParse);
xmlparser.freeParser (v_prsParser);
RETURN v_nlNodeList;
EXCEPTION
WHEN OTHERS THEN
-- write the error
END fcn_Get_Node_List;
Calling this function throws:
java.lang.NullPointerException
at oracle.xml.parser.plsql.XMLNodeCover.getNodeList(XMLNodeCover.java:73)
at oracle.xml.parser.plsql.XMLNodeListCover.getLength(XMLNodeListCover.java:37)
If I remove 'xmldom.freeDocument (v_docParse);', then the function works fine.
Question: I think I need to free the document to conserve memory; however, I can't figure out how to free the document prior to returning the node list. Any ideas?
Thanks.
Brian

What is the XDK version?It's the version that installs with the 8.1.7. I think the XDK Version is called 8.1.7 as well.

Similar Messages

  • INSERTION OF XML DATA INTO THE TABLE USING XMLDOM

    hello,
    i am using XMLDOM to insert the data into the table
    i am using different function of it.
    but i am facing the problem to retrive the the multiple entry.
    like in my example i have two entry of the ' po number '
    & i am using the function
    dbms_xmldom.item(l_nodelist, 0)
    i which i have to pass index no.
    & through this i am getting only single entry according to the index no.
    Example on which i am working is
    declare
    l_xml_data CLOB;
    l_xml_doc dbms_xmldom.domdocument;
    l_nodelist dbms_xmldom.DOMNodeList;
    l_node dbms_xmldom.domnode;
    l_xmltype XMLTYPE;
    l_po_num VARCHAR2(30);
    l_cust_ord VARCHAR2(30);
    l_item_code VARCHAR2(30);
    begin
    l_xml_data := '<?xml version="1.0" encoding="UTF-8"?>
    <!--DOCTYPE MobileInventoryResponse SYSTEM "MobileInventoryResponse.dtd"-->
    <MobileInventoryResponse>
         <message>
              <message-header>
                   <message-id>16244182</message-id>
                   <transaction-name>ship-advice</transaction-name>
                   <partner-name>cbeyond</partner-name>
                   <source-url>http://www.brightpoint.com</source-url>
                   <create-timestamp>20080826150709</create-timestamp>
                   <response-request>1</response-request>
              </message-header>
              <ship-advice>
                   <header>
                        <customer-id>297859</customer-id>
                        <shipment-information>
                             <ship-first-name>RA_13Aug_1</ship-first-name>
                             <ship-last-name>MIND</ship-last-name>
                             <ship-address1>test</ship-address1>
                             <ship-city>test</ship-city>
                             <ship-state>VA</ship-state>
                             <ship-post-code>22102-4931</ship-post-code>
                             <ship-country-code>US</ship-country-code>
    <ship-phone1>0040726335068</ship-phone1>
    <ship-email>[email protected]</ship-email>
    <ship-via>FX01</ship-via>
    <ship-request-date>20080826</ship-request-date>
    <ship-request-warehouse>CBY1</ship-request-warehouse>
    </shipment-information>
    <purchase-order-information>
    <purchase-order-number>380928</purchase-order-number>
    <purchase-order-number>380929</purchase-order-number> ----modi by Ananda Dubey
    <account-description/>
    <purchase-order-amount>0.0</purchase-order-amount>
    <currency-code>USD</currency-code>
    </purchase-order-information>
    <order-header>
    <customer-order-number>0002759</customer-order-number>
    <customer-order-date>20080826</customer-order-date>
    <order-sub-total>19.0</order-sub-total>
    <order-discount>0.0</order-discount>
    <order-tax1>0.0</order-tax1>
    <order-tax2>0.0</order-tax2>
    <order-tax3>0.0</order-tax3>
    <order-shipment-charge>18.0</order-shipment-charge>
    <order-total-net>0.0</order-total-net>
    <order-status>Completed</order-status>
    <order-type/>
    <brightpoint-order-number>35028788</brightpoint-order-number>
    <warehouse-id>CBY1</warehouse-id>
    <ship-date>20080826</ship-date>
    </order-header>
    </header>
    <detail>
    <line-item>
    <line-no>1</line-no>
    <item-code>SKU1</item-code>
    <universal-product-code>0</universal-product-code>
    <ship-quantity>1.0</ship-quantity>
    <unit-of-measure>EA</unit-of-measure>
    <serial-list>
    <serial-numbers>
    <esn>TIMI000013</esn>
    </serial-numbers>
    </serial-list>
    <line-status/>
    <base-price>0.0</base-price>
    <line-discount>0.0</line-discount>
    <line-tax1>0.0</line-tax1>
    <line-tax2>0.0</line-tax2>
    <line-tax3>0.0</line-tax3>
    <bill-of-lading>929406733828</bill-of-lading>
    <scac>FX01</scac>
    </line-item>
    </detail>
    </ship-advice>
    <transactionInfo>
                   <eventID>16244182</eventID>
              </transactionInfo>
         </message>
    </MobileInventoryResponse>';
    l_xml_doc := dbms_xmldom.newDomDocument(l_xml_data);
    -- Method 1 to get data
    l_nodelist := dbms_xmldom.getelementsbytagname(l_xml_doc, 'purchase-order-number');
    l_node := dbms_xmldom.item(l_nodelist, 0); -- gets first item from list
    l_po_num := dbms_xmldom.getnodevalue(dbms_xmldom.getfirstchild(l_node));
    dbms_output.put_line(l_po_num);
    l_nodelist := dbms_xslprocessor.selectnodes(dbms_xmldom.makenode(l_xml_doc),
    '/MobileInventoryResponse/message/ship-advice/detail/line-item/item-code');
    l_node := dbms_xmldom.item(l_nodelist, 0); -- gets first item from list
    l_item_code := dbms_xmldom.getnodevalue(dbms_xmldom.getfirstchild(l_node));
    dbms_output.put_line(l_item_code);
    l_xmltype := XMLTYPE(l_xml_data);
    l_cust_ord := l_xmltype.extract('/MobileInventoryResponse/message/ship-advice/header/order-header/customer-order-number/text()').getStringVal();
    dbms_output.put_line(l_cust_ord);
    dbms_xmldom.freeDocument(l_xml_doc);
    end;
    /

    In the following code
    l_nodelist := dbms_xmldom.getelementsbytagname(l_xml_doc, 'purchase-order-number');
    l_node := dbms_xmldom.item(l_nodelist, 0); -- gets first item from listYou need to understand what the second parm on the .item call does. See [dbms_xmldom.item|http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_xmldom.htm#i1126138]
    The nodelist is a 0 based array of information and you are only requesting to pull the node info in the first array position. So to get the info in the second array position, you need to use ", 1)". You can also use .getLength and a loop to parse through everything in the node list.

  • Using XMLDOM to process document in XML DB

    I am new to XML and especially XML DB which I however see as an excellent platform on which to base XML based solutions. I have a specific question and apologise beforehand should any of my assumptions be incorrect.
    I wish to create an application which from a number of XML fragments, together with rules governing the behaviour of the fragments (insertion points, overwrite rules etc) are merged together to finally leave me with a complete and valid XML document in XML DB.
    I thought at first that I could use DBMS_XMLDOM to perform this low level processing required. I have however not managed to understand how this can be used together with XMLDB. I am reluctant to use XMLDOM without XMLDB as I am afraid that I will surpass the limits in XML document size apparently imposed by XMLDOM.
    I see a solution where I create a schema based resource in XML DB containing the initial XML structure and then processing any number of the above mentioned fragments to finaly be left with a complete XML document.
    Can I use XMLDOM to do this or am I barking up the wrong tree?
    I would be grateful for any input on techniques that I can apply to perform elementary search/replace/insert on an XML document which I am, from PLSQL, compiling.
    Thanks
    Hans Christiansen

    Hi
    The size of the documents I want to compose are expected vary from a few Kb to 1 or 2 Gb! In a FAQ found somewhere on OTN there was an entry which mentioned that somebody was having trouble with a 50Mb XML document. The recommendation was to use SAX but I am under the impression that this is more useful when the processing is of a more sequential nature.
    The main thread of my question is to gain clarity in the most suitable technique to use when actualy compsing the XML.
    What I want to do is:
    Create resource (XML document) in XML DB.
    Loop through XML fragments together with rules:
    For each fragment process according to rules and insert
    fragment or update existing XML based on fragment contents.
    At the end of the loop the XML document is complete and ready for further processing.
    XMLDOM seems to give me the tools to do this but I am unsure of how to do this and have XMLDOM work directly against the contents in the resource controlled by XML DB (making use of possible indexes and the scalable nature of XMLDB). I get the feeling that if I simply read the XML from XMLDB resource into a DOM document I am still using the memory based representation of the XML until I write the XML back to XMLDB - is this a correct assumption.
    Alternatively is it the functionality offered by XPath, extract(), updatexml() etc. that I should be looking at?
    Does this make my question more understandable?
    Hans

  • Load XLM into pl sql using xmldom

    Hi ,
    I have problems when I use xmldom to retrieve infotmation from xml to storethe information into a table. For the first xml , I can do it , for the second one I have problems ( I can't retrieve the values I need ) and I don't know why. Please don't reply me by providing links , I just would like to have an idea of what is going wrong with the second xml. Thanks in advance.
    It works fine with this one :
    <?xml version="1.0" encoding="windows-1252" ?>
    - <GraydonBeDialogue>
    <TransactionCode>RTB</TransactionCode>
    - <Table ClassTable="Country">
    - <TableEntry>
    <TableLanguage>N</TableLanguage>
    <TableCode>AD</TableCode>
    <TableValue>Andorra</TableValue>
    </TableEntry>
    - <TableEntry>
    <TableLanguage>N</TableLanguage>
    <TableCode>AE</TableCode>
    <TableValue>Verenigde Arabische Emiraten</TableValue>
    </TableEntry>
    - <TableEntry>
    <TableLanguage>N</TableLanguage>
    <TableCode>AF</TableCode>
    <TableValue>Afghanistan</TableValue>
    </TableEntry>
    - <TableEntry>
    <TableLanguage>N</TableLanguage>
    <TableCode>AG</TableCode>
    <TableValue>Antigua en Barbuda</TableValue>
    </TableEntry>
    But it does not work with this one :
    <?xml version="1.0" encoding="windows-1252" ?>
    - <GraydonBeDialogue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com Z:\PROGRAMMATIE\AS400\projecten\XML\GraydonBe\InfoReview\Review.xsd" xmlns="http://www.w3schools.com">
    <Transaction>PDT</Transaction>
    - <GraydonBeInformation>
    - <Default>
    <DateFormat>YYYYMMDD</DateFormat>
    <TimeFormat>HHMMSS</TimeFormat>
    <Currency>EUR</Currency>
    <CountryCode>BE</CountryCode>
    <DecimalSign>.</DecimalSign>
    </Default>
    - <Header>
    <Name>GRAYDON BELGIUM NV /SA</Name>
    <ContentGenerationDate>20050722</ContentGenerationDate>
    <ContentGenerationTime>101110</ContentGenerationTime>
    <Product>REV</Product>
    <ClientNumber>156</ClientNumber>
    </Header>
    - <Body>
    - <Msg48>
    - <MsgHeader>
    <MsgDate>20050712</MsgDate>
    <MsgCode Table="RevDsoMsg">48</MsgCode>
    - <Business>
    <BusinessNumber>0480316383</BusinessNumber>
    <Name>STANLEYBET BELGIQUE SA</Name>
    - <Address>
    <Street>PEGASUSLAAN 5</Street>
    <PostCode>1831</PostCode>
    <City>MACHELEN</City>
    </Address>
    </Business>
    </MsgHeader>
    <SinceDate Format="YYYYMM">200506</SinceDate>
    </Msg48>
    - <Msg123>
    - <MsgHeader>
    <MsgDate>20050711</MsgDate>
    <MsgCode Table="RevDsoMsg">123</MsgCode>
    - <Business>
    <BusinessNumber>0403157932</BusinessNumber>
    <Name>CELANESE NV</Name>
    - <Address>
    <Street>INDUSTRIEWEG 80</Street>
    <PostCode>3620</PostCode>
    <City>LANAKEN</City>
    </Address>
    </Business>
    </MsgHeader>
    - <PreviousCreditAssessement>
    <CreditAssessementAmount>10691000</CreditAssessementAmount>
    </PreviousCreditAssessement>
    - <NewCreditAssessement>
    <CreditAssessementAmount>9706000</CreditAssessementAmount>
    </NewCreditAssessement>
    </Msg123>
    Could you explain me what could be wrong ?
    I am using the same logic for both xml :
    declare
    bnb xmldom.domnodelist;
    l_node xmldom.domnode;
    l_doc xmldom.domdocument;
    begin
    parse_document (l_file_name, doc_in);
    bnb := selected_nodes (doc_in, '/GraydonBeDialogue/Table[@ClassTable="Review"]/TableEntry');
    FOR entry_index IN 0 .. xmldom.getlength (bnb) - 1
    LOOP
    l_node := xmldom.item (bnb, entry_index);
    TableLanguage := trim(xslprocessor.valueof (l_node, 'TableLanguage'));
    TableCode := trim(xslprocessor.valueof (l_node, 'TableCode'));
    TableValue := trim(xslprocessor.valueof (l_node, 'TableValue'));
    -- Treat the data
    .....

    Couple of friendly tips.
    When pasting XML, don't copy it directly from the browser's normal view as that usually inserts a "-" on some lines, which makes it invalid XML when you copy/paste. Either open the XML in something besides a browser or do a View Page Source (or similar) to copy the true XML.
    Use the tag to wrap XML and code to retain formatting as shown in the FAQ (under your sign-in name in the upper right).
    In your first sample XML, the root node is defined as
    <GraydonBeDialogue>
    and in the second it is defined as (ignoring attributes that don't matter to us now)
    <GraydonBeDialogue xmlns="http://www.w3schools.com">
    This means the second XML resides in a default namespace and so to access any/all nodes that reside in this namespace, you must provide that namespace to the extract method.
    For many Oracle based functions that take an Xpath as a parm, Oracle has the next parm defined as the namespace.  This allows you to pass in the namespace associated to the XML nodes.  With default namespaces, it does add a twist as you have to make up a namespace prefix for the Xpath/namespace declaration so that the engine knows the nodes reside in a namespace (be it default) instead of not residing in a namespace.  Here's a little something I wrote up on this
    http://anononxml.blogspot.com/2010/06/xml-parsing-with-default-namespaces-via.html
    I prefer now to use XMLType when parsing XML in PL/SQL as a bit more flexible/easier to code.
    Without seeing what you hid in
    selected_nodes
    it is hard to say exactly where your problem is but hopefully that gives you a start.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • Using xmldom.writeToClob to update xml clob corrupts clob

    We are storing an xml document in a clob field in the db. As part of a data check we need to parse the xml and possibly remove a node. I can do that, and check the results using 'xmldom.writeToBuffer'.
    When I try to write the data back to the db using 'xmldom.writeToClob' I get strange results. Data seems to be appended to the end of the clob and contains chr(13) characters at the end of each line.
    Also does anyone know if the existence of whitespace in the xml clob would cause a parse/search to be slower?
    I am new to xml and might be missing something fairly basic in the following code. Thanks in advance for any help.
    Here is some of the code:
    doc xmldom.DOMDocument;
    curNode xmldom.DOMNode;
    parentNode xmldom.DOMNode;
    theNodeList xmldom.DOMNodeList;
    str varchar2(4000);
    begin
    -- open xml_rec cursor (xml is the clob field opened for update)
    -- Loop through all item elements
    theNodeList := xmldom.getElementsByTagName(doc, 'item');
    for m in 0..xmldom.getLength(theNodeList)-1 loop
    curNode := xmldom.item(theNodeList,m);
    --perform a check and possibly delete the current node
    parentNode := xmldom.getParentNode(curNode);
    parentNode := xmldom.removechild(parentNode, curNode);
    xmldom.writeToBuffer(doc, str);
    --I check the results here and everything looks good
    xmldom.writeToClob(doc, xml_rec.xml);
    --When I check the clob the data is incorrect.
    null

    The next cod is a sample of the implementation xmldom.writeToClob used xmldom.DOMNode in the parameter of input.
    DECLARE
    XMLOut CLOB := EMPTY_CLOB();
    XMLIn Varchar2(2000);
    XSLPath Varchar2(2000);
    BEGIN
    DBMS_LOB.CREATETEMPORARY(XMLOut,TRUE); -- Give permit
    DBMS_LOB.OPEN (XMLOut, DBMS_LOB.LOB_READWRITE); --open the file of read and write
    XSLPath := '/users/gcardona/plantillas/report.xsl';
    GE_BSXMLCONVERT.createElementName('COLUMN');
    GE_BSXMLCONVERT.createElementAttribute('name', 'OUTXML');
    GE_BSXMLCONVERT.addElement();
    GE_BSXMLCONVERT.createElementName('table');
    GE_BSXMLCONVERT.createElementAttribute('name', 'X1');
    GE_BSXMLCONVERT.createElementAttribute('width', '100');
    GE_BSXMLCONVERT.addElement();
    XMLIn := GE_BSXMLCONVERT.toXML();
    XSLTranform(XMLIn, XSLPath, XMLOut);--XMLOut is a variable in out in the procedure,
    --here is where is return the file XML Process
    insert into in_prueba (ID,XML_CLOB) values (200, XMLOut);
    DBMS_LOB.CLOSE (XMLOut); -- Close File
    DBMS_LOB.FREETEMPORARY(XMLOut); --free memory
    GE_BSXMLCONVERT.clearMemory();
    commit;
    END;
    null

  • Set Attribute using xmldom

    I have read in an xml document and provided the user with an interface to update information. I need to use this updated information to set attributes in an DOM Tree using the xmldom pl/sql package. How do I do this

    DBMS_XMLDOM.setAttribute does escape actually :
    SQL> declare
      2   doc dbms_xmldom.DOMDocument;
      3   e   dbms_xmldom.DOMElement;
      4   buf varchar2(4000);
      5  begin
      6   doc := dbms_xmldom.newDOMDocument('<dummy id1="" id2=""/>');
      7   e := dbms_xmldom.getDocumentElement(doc);
      8   dbms_xmldom.setAttribute(e, 'id1', 'R&D');
      9   dbms_xmldom.setAttribute(e, 'id2', 'X''Y');
    10   dbms_xmldom.writeToBuffer(doc, buf);
    11   dbms_xmldom.freeElement(e);
    12   dbms_xmldom.freeDocument(doc);
    13 
    14   dbms_output.put_line(buf);
    15  end;
    16  /
    <dummy id1="R&amp;D" id2="X&apos;Y"/>
    PL/SQL procedure successfully completed
    (tested on 11.2.0.2)
    What issue are you exactly having?
    Post something that we can reproduce on our end.

  • Creating XML File Using xmldom Package

    How can I create an XML file from scratch using the PL/SQL xmldom package?
    I want to create an XML file using the xmldom package instead of building the individual tags as strings of VARCHAR2 character data. There is quite a bit of documentation regarding manipulating input XML files using DOM -- but not for creating XML files from scratch given known "tagnames" (<lastName>) and retrieved database "values" ("Smith").
    <person>
    <lastName>Smith</lastName>
    </person>
    Is there any documentation that you can recommend?
    Thank you.

    Here is an example.
    The create_file procedure creates the file.
    The other procedures are generic procs that can be used with any XML.
    PROCEDURE create_file_with_root(po_xmldoc OUT xmldom.DOMDocument,
    pi_root_tag IN VARCHAR2,
                                            po_root_element OUT xmldom.domelement,
                                            po_root_node OUT xmldom.domnode,
                                            pi_doctype_url IN VARCHAR2) IS
    xmldoc xmldom.DOMDocument;
    root xmldom.domnode;
    root_node xmldom.domnode;
    root_element xmldom.domelement;
    record_node xmldom.domnode;
    newelenode xmldom.DOMNode;
    BEGIN
    xmldoc := xmldom.newDOMDocument;
    xmldom.setVersion(xmldoc, '1.0');
    xmldom.setDoctype(xmldoc, pi_root_tag, pi_doctype_url,'');
    -- Create the root --
    root := xmldom.makeNode(xmldoc);
    -- Create the root element in the file --
    create_element_and_append(xmldoc, pi_root_tag, root, root_element, root_node);
    po_xmldoc := xmldoc;
    po_root_node := root_node;
    po_root_element := root_element;
    END create_file_with_root;
    PROCEDURE create_element_and_append(pi_xmldoc IN OUT xmldom.DOMDocument,
    pi_element_name IN VARCHAR2,
                                            pi_parent_node IN xmldom.domnode,
                                            po_new_element OUT xmldom.domelement,
                                            po_new_node OUT xmldom.domnode) IS
    element xmldom.domelement;
    child_node xmldom.domnode;
    newelenode xmldom.DOMNode;
    BEGIN
    element := xmldom.createElement(pi_xmldoc, pi_element_name);
    child_node := xmldom.makeNode(element);
    -- Append the new node to the parent --
    newelenode := xmldom.appendchild(pi_parent_node, child_node);
    po_new_node := child_node;
    po_new_element := element;
    END create_element_and_append;
    FUNCTION create_text_element(pio_xmldoc IN OUT xmldom.DOMDocument, pi_element_name IN VARCHAR2,
    pi_element_data IN VARCHAR2, pi_parent_node IN xmldom.domnode) RETURN xmldom.domnode IS
    parent_node xmldom.domnode;                                   
    child_node xmldom.domnode;
    child_element xmldom.domelement;
    newelenode xmldom.DOMNode;
    textele xmldom.DOMText;
    compnode xmldom.DOMNode;
    BEGIN
    create_element_and_append(pio_xmldoc, pi_element_name, pi_parent_node, child_element, child_node);
    parent_node := child_node;
    -- Create a text node --
    textele := xmldom.createTextNode(pio_xmldoc, pi_element_data);
    child_node := xmldom.makeNode(textele);
    -- Link the text node to the new node --
    compnode := xmldom.appendChild(parent_node, child_node);
    RETURN newelenode;
    END create_text_element;
    PROCEDURE create_file IS
    xmldoc xmldom.DOMDocument;
    root_node xmldom.domnode;
    xml_doctype xmldom.DOMDocumentType;
    root_element xmldom.domelement;
    record_element xmldom.domelement;
    record_node xmldom.domnode;
    parent_node xmldom.domnode;
    child_node xmldom.domnode;
    newelenode xmldom.DOMNode;
    textele xmldom.DOMText;
    compnode xmldom.DOMNode;
    BEGIN
    xmldoc := xmldom.newDOMDocument;
    xmldom.setVersion(xmldoc, '1.0');
    create_file_with_root(xmldoc, 'root', root_element, root_node, 'test.dtd');
    xmldom.setAttribute(root_element, 'interface_type', 'EXCHANGE_RATES');
    -- Create the record element in the file --
    create_element_and_append(xmldoc, 'record', root_node, record_element, record_node);
    parent_node := create_text_element(xmldoc, 'title', 'Mr', record_node);
    parent_node := create_text_element(xmldoc, 'name', 'Joe', record_node);
    parent_node := create_text_element(xmldoc,'surname', 'Blogs', record_node);
    -- Create the record element in the file --
    create_element_and_append(xmldoc, 'record', root_node, record_element, record_node);
    parent_node := create_text_element(xmldoc, 'title', 'Mrs', record_node);
    parent_node := create_text_element(xmldoc, 'name', 'A', record_node);
    parent_node := create_text_element(xmldoc, 'surname', 'B', record_node);
    -- write the newly created dom document into the buffer assuming it is less than 32K
    xmldom.writeTofile(xmldoc, 'c:\laiki\willow_data\test.xml');
    EXCEPTION
    WHEN xmldom.INDEX_SIZE_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Index Size error');
    WHEN xmldom.DOMSTRING_SIZE_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'String Size error');
    WHEN xmldom.HIERARCHY_REQUEST_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Hierarchy request error');
    WHEN xmldom.WRONG_DOCUMENT_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Wrong doc error');
    WHEN xmldom.INVALID_CHARACTER_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Invalid Char error');
    WHEN xmldom.NO_DATA_ALLOWED_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Nod data allowed error');
    WHEN xmldom.NO_MODIFICATION_ALLOWED_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'No mod allowed error');
    WHEN xmldom.NOT_FOUND_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Not found error');
    WHEN xmldom.NOT_SUPPORTED_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'Not supported error');
    WHEN xmldom.INUSE_ATTRIBUTE_ERR THEN
    RAISE_APPLICATION_ERROR(-20120, 'In use attr error');
    WHEN OTHERS THEN
    dbms_output.put_line('exception occured' || SQLCODE || SUBSTR(SQLERRM, 1, 100));
    END create_file;

  • Exception when using  XMLDOM.appendData

    I am trying to create an xml-document containing base64 encoded data by using the xmldom packages on an 8.1.7 DB.
    Everthing works o.k. until I try to append data to an DOMCharacterData Node.This is the point where my function always ends up catching an ORA-29532 java.lang.ClassCastException exception
    I did a lot of research the last few days but did not find any similar cases.
    Does anyone have a solution or can provide hints where to find informations regarding.
    Thank you
    Edmund
    The following function is not exactly the one I am using but it also ends up in an exception!
    FUNCTION fddoc_CreateUploadDoc(pvi_Docname IN VARCHAR2, pvi_Doctype IN VARCHAR2, pvi_Data IN VARCHAR2)
    RETURN xmldom.DOMDocument
    IS
    doc                xmldom.DOMDocument;
    main_node           xmldom.DOMNode;
    root_node           xmldom.DOMNode;
    cmd_node           xmldom.DOMNode;
    document_node          xmldom.DOMNode;
    data_node          xmldom.DOMNode;
    data_cont          xmldom.DOMCharacterData;
    root_elmt           xmldom.DOMElement;
    cmd_elmt          xmldom.DOMElement;
    data_elmt               xmldom.DOMElement;
    BEGIN
         doc := xmldom.newDOMDocument;
         xmldom.setVersion(doc,'1.0');
         -- Root
         main_node := xmldom.makeNode(doc);
         root_elmt := xmldom.createElement(doc, 'ArchiveCommand');
         xmldom.setAttribute(root_elmt, 'version', '1.0');
         root_node := xmldom.appendChild( main_node, xmldom.makeNode(root_elmt));
         -- Command
         cmd_elmt := xmldom.createElement(doc,'ArchiveInsert');
         xmldom.setAttribute(cmd_elmt,'type','HYPARCHIV');
         xmldom.setAttribute(cmd_elmt,'archiveid',1);
         cmd_node := xmldom.appendChild( root_node, xmldom.makeNode(cmd_elmt));
         -- Document
         document_elmt := xmldom.createElement(doc,'Document');
         xmldom.setAttribute(document_elmt,'archiveid',1);
         xmldom.setAttribute(document_elmt, 'id','');
         xmldom.setAttribute(document_elmt, 'name',pvi_Docname);
         xmldom.setAttribute(document_elmt, 'type',pvi_Doctype);
         document_node := xmldom.appendChild(cmd_node, xmldom.makeNode(document_elmt));
         -- Data
         data_elmt := xmldom.createElement(doc,'Data');
         xmldom.setAttribute(data_elmt, 'type',pvi_Doctype);
         data_node := xmldom.appendChild(document_node, xmldom.makeNode(data_elmt));
         data_cont := xmldom.makeCharacterData(data_node);
         xmldom.appendData( data_cont,pvi_Data);/* <- this causes the Exception*/
         RETURN doc;
    END;

    Try something like requestScope or backingBeanScope.

  • Using xmldom.writetoclob

    I am using the procedure xmldom.writetoclob with the PL/SQL
    XDK.
    I am running into speed concerns.
    Below are some results of tests I have done.
    As you can see the time taken to write the contents of the
    DOM out to a clob can quickly become problem for a user waiting
    for a reponse.
    Can any one tell me of a way to speed up this process or a
    work around?
    Thanks very much
    Rick Laird
    clob size= 2913
    start xmldom.writetoclob= 01:57:53
    end xmldom.writetoclob= 01:57:54
    clob size= 8909
    start xmldom.writetoclob= 01:58:06
    end xmldom.writetoclob= 01:58:12
    clob size= 14905
    start xmldom.writetoclob= 01:58:45
    end xmldom.writetoclob= 01:58:55
    clob size= 22400
    start xmldom.writetoclob= 01:59:44
    end xmldom.writetoclob= 01:59:59
    clob size= 29895
    start xmldom.writetoclob= 02:01:09
    end xmldom.writetoclob= 02:01:29
    clob size= 172300
    start xmldom.writetoclob= 02:05:59
    end xmldom.writetoclob= 02:07:54
    clob size= 286224
    start xmldom.writetoclob= 02:15:34
    end xmldom.writetoclob= 02:18:42

    what version of XDK are you using ?
    How much memory do you have ?
    I am getting this results :
         Writting to clob     01/09/2002 9:51:07 AM     
         Done writting to clob     01/09/2002 9:51:13 AM          
         Size of clob : 370433     01/09/2002 9:51:13 AM          

  • Problem retrieving Data from a CDATA-Section using XMLDOM

    Hello,
    Ware: Oracle 8.1.7.4 64bit, XDK for PL/SQL Version 9.2.0.3, Solaris8 64bit
    I can't retrieve Data from the CDATA-Section of an XML-String, neither with
    getData(DOMCharacterData) or substringData. Also getLength fails. I get always
    the following error:
    ERROR at line 1:
    ORA-29532: Java call terminated by uncaught Java exception: java.lang.ClassCastException
    ORA-06512: at "XML_SCHEMA.XMLCHARDATACOVER", line 0
    ORA-06512: at "XML_SCHEMA.XMLDOM", line 853
    ORA-06512: at "SCHWABE.XML_TEST", line 47
    ORA-06512: at line 1
    I can successfully cast the DOMNode to a CharacterData with makeCharacterData
    and check with isNull (DOMCharacterData) (returns FALSE).
    My Testcase:
    1) A Function which build a XML-Document:
    CREATE OR REPLACE FUNCTION XML_ResponseCalc RETURN VARCHAR2 IS
    doc VARCHAR2(32767);
    BEGIN
    doc :=
    '<?xml version="1.0" encoding="UTF-8"?>
    <RSDecEng>
    <Version>1.00</Version>
    <ResponseCalc>
    <ID>00000000000000000014</ID>
    <Burst>
    <Definition>
    <Count>1</Count>
    <ID>
    <Start>1</Start>
    <Length>4</Length>
    </ID>
    <Var>
    <Name>Risiko_1</Name>
    <Start>5</Start>
    <Length>5</Length>
    </Var>
    </Definition>
    <Data>
    <Length>9</Length>
    <Count>5</Count>
    <![CDATA[
    1 0.001
    2 0.002
    3 0.003
    4 0.004
    5 0.005
    6 0.006
    7 0.007
    8 0.008
    9 0.009
    10 0.010
    ]]>
    </Data>
    </Burst>
    </ResponseCalc>
    </RSDecEng>
    2) The Procedure which parses the XML-Document (no Exception-Handling):
    CREATE OR REPLACE PROCEDURE XML_TEST IS
    Parser XML_SCHEMA.XMLParser.Parser;
    DOMDocument XML_SCHEMA.XMLDOM.DOMDocument;
    DOMNode XML_SCHEMA.XMLDOM.DOMNode;
    DOMNodeItem XML_SCHEMA.XMLDOM.DOMNode;
    DOMNodeList XML_SCHEMA.XMLDOM.DOMNodeList;
    DOMCharacterData XML_SCHEMA.XMLDOM.DOMCharacterData;
    TheDocument CLOB;
    ID VARCHAR2(100);
    Data VARCHAR2(200);
    BEGIN
    -- LOB
    DBMS_LOB.CREATETEMPORARY(TheDocument, TRUE);
    DBMS_LOB.WRITEAPPEND(TheDocument, LENGTH(XML_ResponseCalc), XML_ResponseCalc);
    -- Parse
    Parser := XML_SCHEMA.XMLParser.NewParser;
    XML_SCHEMA.XMLParser.ParseCLOB(Parser, TheDocument);
    DOMDocument := XML_SCHEMA.XMLParser.GetDocument(Parser);
    XML_SCHEMA.XMLParser.FreeParser(Parser);
    -- Node
    DOMNode := XML_SCHEMA.XMLDOM.MakeNode(DOMDocument);
    -- Get ID
    DOMNodeList := XML_SCHEMA.XSLProcessor.SelectNodes
    (DOMNode,'/RSDecEng/ResponseCalc/ID/text()');
    IF XML_SCHEMA.XMLDOM.GetLength(DOMNodeList) > 0 THEN
    DOMNodeItem := XML_SCHEMA.XMLDOM.Item(DOMNodeList, 0);
    XML_SCHEMA.XMLDOM.WriteToBuffer(DOMNodeItem, ID);
    SYS.DBMS_OUTPUT.PUT_LINE ('ID: '||ID);
    END IF;
    -- Get CDATA
    DOMCharacterData := XML_SCHEMA.XMLDOM.MakeCharacterData(DomNode); -- <-- ok here...
    IF NOT XML_SCHEMA.XMLDOM.isNull (DOMCharacterData) THEN -- <-- ...and here
    Data := XML_SCHEMA.XMLDOM.GETDATA(DOMCharacterData); -- <-- ...but here Exception raise
    END IF;
    END;
    I hope you can help me.
    Thank you in advance
    Markus Schwabe

    You need to notice the definitions for makecharacterdata:
    FUNCTION makeCharacterData(n DOMNode) RETURN DOMCharacterData;
    PURPOSE
    Casts given DOMNode to a DOMCharacterData
    It only do the casting.

  • Tag casing in XML using XMLDOM

    Hi,
    Is there a way of disabling the Uppercasing function with XMLDOM, as I like to produce a tag which is of mix case, it always makes it uppercase as the tag....

    > But for reasons of volume I need to generate the XML without the explicit closing tag, such as:
    >
    >  <TAG1 value = u201CXXXu201D/>
    >
    > Is there any possibility to achieve this with graphical mapping?
    This is not posible. The graphical mapping always creates start and end tag, even for empty elements.
    You need a seperate mapping step with XSLT or Java mapping.
    Regards
    Stefan

  • Using xmldom.appendChild function

    Hi , I'm trying to parse 2 xml strings.
    I have successfully generated the 2 strings names xmlString1 & xmlString2.
    Next I do parsing. This is some part of the code --
    p := xmlparser.newParser;
    xmlparser.parseClob(p, xmlString1);
    xmldoc1 := xmlparser.getDocument(p);
    xmlparser.parseClob(p, xmlString2);
    xmldoc2 := xmlparser.getDocument(p);
    xmldoc := xmldom.newDOMDocument;
    xmldom.setVersion(xmldoc,'1.0');
    -- create a root element for the new document
    rootElement := xmldom.createElement(xmldoc , 'ORDER');
    root1Element := xmldom.getDocumentElement(xmldoc1);
    root2Element := xmldom.getDocumentElement(xmldoc2);
    domNode1 := xmldom.makeNode(rootElement);
    domNode2 := xmldom.makeNode(root1Element);
    domNode3 := xmldom.makeNode(root2Element);
    dbms_output.put_line('hi1');
    xmldocnode := xmldom.appendChild(domNode1,domNode2);
    dbms_output.put_line('hi2');
    While executing I get the 'hi1' but not 'hi2'.
    It gives PL/SQL procedure successfully completed. But does nothing from the appendChild function call.
    xmldocnode,domNode1,domNode2 have been declared xmldom.DOMNode type.
    Thanks
    null

    Hi , I'm trying to parse 2 xml strings.
    I have successfully generated the 2 strings names xmlString1 & xmlString2.
    Next I do parsing. This is some part of the code --
    p := xmlparser.newParser;
    xmlparser.parseClob(p, xmlString1);
    xmldoc1 := xmlparser.getDocument(p);
    xmlparser.parseClob(p, xmlString2);
    xmldoc2 := xmlparser.getDocument(p);
    xmldoc := xmldom.newDOMDocument;
    xmldom.setVersion(xmldoc,'1.0');
    -- create a root element for the new document
    rootElement := xmldom.createElement(xmldoc , 'ORDER');
    root1Element := xmldom.getDocumentElement(xmldoc1);
    root2Element := xmldom.getDocumentElement(xmldoc2);
    domNode1 := xmldom.makeNode(rootElement);
    domNode2 := xmldom.makeNode(root1Element);
    domNode3 := xmldom.makeNode(root2Element);
    dbms_output.put_line('hi1');
    xmldocnode := xmldom.appendChild(domNode1,domNode2);
    dbms_output.put_line('hi2');
    While executing I get the 'hi1' but not 'hi2'.
    It gives PL/SQL procedure successfully completed. But does nothing from the appendChild function call.
    xmldocnode,domNode1,domNode2 have been declared xmldom.DOMNode type.
    Thanks
    null

  • Upadting XML File in Oracle using xmldom package.

    Are there any possible ways on this situation.When you have parsed a given document and change the values of the nodes that you wanted to change.Now you want the xml file to be updated.One way is the write to file command which takes in the document object as arguement and writes to the file specified as the second arguement.This process recreates the whole xml file and thereby overwriting the unchanged values and the changed values.Now is there anyway in which i can just write to the file ( represented in the memory as nodes whose values i have changed ) the values that have been changed,i.e the tags for which the values have been changed.Any starting ideas would be helpful.Is it possible to do the second way,are there any reasons on why it cannot be done,any feature restriction or is there a way around it.Expecting ideas as soon as possible.
    With Regards
    gopal

    https://forums.oracle.com/forums/message.jspa?messageID=10796815#10796815
    DUPLICATE thread!
    do NOT multi-post

  • Dbms_lob.createtemporary  memory leak even with dbms_lob.freetemporary

    I've got procedure which basicaly transforms one xml structure into other xml structure and then inserts that other into clob column.
    I'm using xmlParser.parser , xmlDom.DomDocument .
    After every iterations of procedure my PGA grows .
    I'm using xmldom.freeDocument(doc) xmldom.freeDocument(document) xmlparser.freeparser(parser) and dbms_lob.freetemporary .
    So have no idea what could cause the memory leak .
    Is DBMS_LOB.CALL duratino solution to my problem ?
    Default is session long DBMS_LOB.SESSION .
    wynik        CLOB;
      v_xc         CLOB;
      doc          xmldom.DOMDocument
    BEGIN
        dbms_lob.createtemporary(wynik,true);
        INSERT INTO tabxml  
          (id_xml, dane)
        VALUES
          (XML_ID, empty_clob())
        RETURNING dane into v_xc;
        xmldom.writeToClob(doc, wynik);
        dbms_lob.copy(v_xc,wynik, dbms_lob.getlength(wynik));
       dbms_lob.freetemporary(wynik);
    END;DB 9.2.0.8
    Regards.
    Greg

    Hi,
    we had the bug 6506818 in 10.2.0.3 on AIX. This is a bug from xmltype to char. The bug also exists in 9.2.0.8. Maybe you are hitting that one. There is a patch for AIX en Sun Solaris.
    I looked further and there is also bug 5726433, memory leak on DBMS_XMLDOM.newdocument. Fot this one is a patch on linux.
    Herald ten Dam
    Superconsult.nl
    Edited by: Herald ten Dam on 25-mrt-2010 14:04

  • Memory leak using xslprocessor.valueof in 11.1.0.6.0 - 64bit ??

    My company has made the decision to do all of our internal inter-system communication using XML. Often we may need to transfer thousands of records from one system to another and due to this (and the 32K limit in prior versions) we're implementing it in 11g. Currently we have Oracle 11g Enterprise Edition Release 11.1.0.6.0 on 64 bit Linux.
    This is a completely network/memory setup - the XML data comes in using UTL_HTTP and is stored in a CLOB in memory and then converted to a DOMDocument variable and finally the relevant data is extracted using xslprocessor.valueof calls.
    While this is working fine for smaller datasets, I've discovered that repeated calls with very large documents cause the xslprocessor to run out of memory with the following message:
    ERROR at line 1:
    ORA-04030: out of process memory when trying to allocate 21256 bytes
    (qmxdContextEnc,)
    ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 1010
    ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 1036
    ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 1044
    ORA-06512: at "SCOTT.UTL_INTERFACE_PKG", line 206
    ORA-06512: at line 28
    Elapsed: 00:03:32.45
    SQL>
    From further testing, it appears that the failure occurs after approximately 161,500 calls to xslprocessor.valueof however I'm sure this is dependent on the amount of server memory available (6 GB in my case).
    I expect that we will try and log a TAR on this, but my DBA is on vacation right now. Has anyone else tried calling the xslprocessor 200,000 times in a single session?
    I've tried to make my test code as simple as possible in order to track down the problem. This first block simply iterates through all of our offices asking for all of the employees at that office (there are 140 offices in the table).
    DECLARE
    CURSOR c_offices IS
    SELECT office_id
    FROM offices
    ORDER BY office_id;
    r_offices C_OFFICES%ROWTYPE;
    BEGIN
    OPEN c_offices;
    LOOP
    FETCH c_offices INTO r_offices;
    EXIT WHEN c_offices%NOTFOUND;
    utl_interface_pkg.get_employees(r_offices.office_id);
    END LOOP;
    CLOSE c_offices;
    END;
    Normally I'd be returning a collection of result data from this procedure, however I'm trying to make things as simple as possible and make sure I'm not causing the memory leak myself.
    Below is what makes the SOAP calls (using the widely circulated UTL_SOAP_API) to get our data and then extracts the relevant parts. Each office (call) should return between 200 and 1200 employee records.
    PROCEDURE get_employees (p_office_id IN VARCHAR2)
    l_request utl_soap_api.t_request;
    l_response utl_soap_api.t_response;
    l_data_clob CLOB;
    l_xml_namespace VARCHAR2(100) := 'xmlns="' || G_XMLNS_PREFIX || 'EMP.wsGetEmployees"';
    l_xml_doc xmldom.DOMDocument;
    l_node_list xmldom.DOMNodeList;
    l_node xmldom.DOMNode;
    parser xmlparser.Parser;
    l_emp_id NUMBER;
    l_emp_first_name VARCHAR2(100);
    l_emp_last_name VARCHAR2(100);
    BEGIN
    --Set our authentication information.
    utl_soap_api.set_proxy_authentication(p_username => G_AUTH_USER, p_password => G_AUTH_PASS);
    l_request := utl_soap_api.new_request(p_method => 'wsGetEmployees',
    p_namespace => l_xml_namespace);
    utl_soap_api.add_parameter(p_request => l_request,
    p_name => 'officeId',
    p_type => 'xsd:string',
    p_value => p_office_id);
    l_response := utl_soap_api.invoke(p_request => l_request,
    p_url => G_SOAP_URL,
    p_action => 'wsGetEmployees');
    dbms_lob.createtemporary(l_data_clob, cache=>FALSE);
    l_data_clob := utl_soap_api.get_return_clob_value(p_response => l_response,
    p_name => '*',
    p_namespace => l_xml_namespace);
    l_data_clob := DBMS_XMLGEN.CONVERT(l_data_clob, 1); --Storing in CLOB converted symbols (<">) into escaped values (&lt;, &qt;, &gt;).  We need to CONVERT them back.
    parser := xmlparser.newParser;
    xmlparser.parseClob(parser, l_data_clob);
    dbms_lob.freetemporary(l_data_clob);
    l_xml_doc := xmlparser.getDocument(parser);
    xmlparser.freeparser(parser);
    l_node_list := xslprocessor.selectNodes(xmldom.makeNode(l_xml_doc),'/employees/employee');
    FOR i_emp IN 0 .. (xmldom.getLength(l_node_list) - 1)
    LOOP
    l_node := xmldom.item(l_node_list, i_emp);
    l_emp_id := dbms_xslprocessor.valueOf(l_node, 'EMPLOYEEID');
    l_emp_first_name := dbms_xslprocessor.valueOf(l_node, 'FIRSTNAME');
    l_emp_last_name := dbms_xslprocessor.valueOf(l_node, 'LASTNAME');
    END LOOP;
    xmldom.freeDocument(l_xml_doc);
    END get_employees;
    All of this works just fine for smaller result sets, or fewer iterations (only the first two or three offices). Even up to the point of failure the data is being extracted correctly - it just eventually runs out of memory. Is there any way to free up the xslprocessor? I've even tried issuing DBMS_SESSION.FREE_UNUSED_USER_MEMORY but it makes no difference.

    Replying to both of you -
    Line 206 is the first call to xslprocessor.valueof:
    LINE TEXT
    206 l_emp_id := dbms_xslprocessor.valueOf(l_node, 'EMPLOYEEID');
    This is one function inside of a larger package (the UTL_INTERFACE_PKG). The package is just a grouping of these functions - one for each type of SOAP interface we're using. None of the others exhibited this problem, but then none of them return anywhere near this much data either.
    Here is the contents of V$TEMPORARY_LOBS immediately after the crash:
    SID CACHE_LOBS NOCACHE_LOBS ABSTRACT_LOBS
    132 0 0 0
    148 19 1 0
    SID 132 is a SYS session and SID 148 is mine.
    I've discovered with further testing that if I comment out all of the xslprocessor.valueof calls except for the first one the code will complete successfully. It executes the valueof call 99,463 times. If I then uncomment one of those additional calls, we double the number of executions to a theoretical 198,926 (which is greater than the 161,500 point where it usually crashes) and it runs out of memory again.

Maybe you are looking for

  • Configuring file sender adapter using share

    Hello! I need to read file from shared directory with user name and password. How can I configure user name and password verification?

  • Plz tell the Main Report prgm for MIGO

    Hi Experts,      Plz tell the Main Report prgm for MIGO, Actually i want to debug the particular prgm,  if i enter in se93 i get the prgm name but every prms are Include prgm only so plz if anybody knows, its a very helpfull for me.. Thanks, Gowri.

  • RedHat 7.0 Install Problem

    Has anyone been able to install Oracle8i on RedHat 7.0. I have gone through the necessary steps for downloading the correct jre from blackdown...setup my oracle user as stated in the installation guide...and i get the error when running the install s

  • APDPROXY - Automatic Startup

    Ok so there's been lots of posts in regards to this issue, I personally responded to a question on how to kill the process, (or so I thought) Ken Mata, "Stop automatic startup??" #1, 10 Sep 2005 4:07 pm so after revisiting that post and finding out t

  • Vibrating mechanism all of a sudden has become really loud and annoying....

    As the title states, my Iphone 4 all of a sudden one day started vibrating really loud, even outside of the case.  I took my phone to the genius bar but they said that it was within normal working parameters.  Problem is, I have another Iphone 4 and