从别人那收到一个大约1M的xml文件,在网上模仿了http://www.linuxidc.com/Linux/2013-02/80014.htm的方法,但是在测试的时候,单步运行到xmlparser.parseClob(xmlPar,partPopedom_xml);时候出错
再次选择测试数据时候,发现原来的XML文件被截取了一半,丢失了一半数据。用自己创建的小XML可以正常执行,所以想知道如何解决该问题?只能从外部用java等语言去解决么?oracle;XML

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE P_AddPartPopedom(partPopedom_xml in clob)
    as
    ------------------=================该存储过程负责存储角色权限================---------------------
    --//XML解析器
     xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; /* AnalyticElongHotelXml analyticElongHotelXml := new AnalyticElongHotelXml(elongHotelsDAO); */
     --//DOM文档对象
     doc xmldom.DOMDocument;               
     len Integer;                                 
     personNodes xmldom.DOMNodeList;             
     chilNodes xmldom.DOMNodeList;              
     tempNode xmldom.DOMNode;                     
     tempArrMap xmldom.DOMNamedNodeMap;           
     --================================ tmp Integer;
     
     VER VARCHAR2(3);                  
     SRC VARCHAR2(12);  
     DES VARCHAR2(12);               
     APP VARCHAR2(80);                 
     MSGNO VARCHAR2(4);               
     MSGID VARCHAR2(20);              
     MSGREF VARCHAR2(40);            
     WORKDATE VARCHAR2(20);            
     RESERVE VARCHAR2(20);             
     
    --================/*partPopedom_xml clob;*/
    BEGIN
     xmlPar := xmlparser.newParser;
     xmlparser.parseClob(xmlPar,partPopedom_xml);   --文件较大时候出错
     doc := xmlparser.getDocument(xmlPar);
     
     
     xmlparser.freeParser(xmlPar);
     personNodes := xmldom.getElementsByTagName(doc, 'HEAD');
     len := xmldom.getLength( personNodes ); --遍历所有HEAD元素
     FOR i in 0..len-1
       LOOP
         --获取第i个
         tempNode := xmldom.item(personNodes, i);
         --所有属性
         tempArrMap := xmldom.getAttributes(tempNode);
         --获取PERSONID的值
         --pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'POPEDOM'));
         --获取子元素的值
         chilNodes := xmldom.getChildNodes(tempNode);
         tmp := xmldom.GETLENGTH(chilNodes);
         
         
         --提取HEAD中的对应值
         VER := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 0)));
         SRC := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 1)));
         DES := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 2)));
         APP := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 3)));
         MSGNO := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 4)));
         MSGID := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 5)));
         MSGREF := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 6)));
         WORKDATE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 7)));
         --RESERVE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 8)));                   --3 RESERVE若无数据则报错   APPLYDATE
         --插入数据
         INSERT INTO HEAD VALUES(VER,SRC,DES,APP,MSGNO,MSGID,MSGREF,WORKDATE,RESERVE);
         COMMIT;
    END LOOP;   xmldom.freeDocument(doc);
       EXCEPTION
        WHEN OTHERS THEN
          DBMS_output.ENABLE(SQLERRM);
     END P_AddPartPopedom;