iteye_17869 2011-10-11 16:32
浏览 375
已采纳

一个解析blob 数据类型的 xml 文件的存储过程,有谁碰到这种情况没?

xml 文件是 以blob 数据类型存储在 数据库,请问用存储过程的 方式解析出来怎么解析?
提示:只能用存储过程,不用java代码。
知道或者做过的 请告诉解决方法,感激不尽!

  • 写回答

2条回答 默认 最新

  • iteye_8576 2011-10-13 10:12
    关注

    1.解析xml需要oracle xml db,先看看是否安装
    [code="sql"]
    SQL> SELECT comp_name "Component" from dba_registry;

    Component

    Oracle Database Catalog Views
    Oracle Database Packages and Types
    Oracle Text
    Oracle XML Database
    SQL>
    [/code]
    如果没有Oracle XML Database 表示没有安装,安装方法参考下:http://blog.csdn.net/fidelhl/article/details/2753384
    2.最好使用clob字段保存xml,因为blob对象是二进制对象,解析xml时候很麻烦。
    下面的代码我在本机测试好用,你参考下:
    [code="sql"]
    CREATE OR REPLACE PROCEDURE readLob IS
    -- lob
    lob_data CLOB;
    lob_size INTEGER;
    -- xml
    xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;
    doc xmldom.DOMDocument;
    len INTEGER;
    personNodes xmldom.DOMNodeList;
    chilNodes xmldom.DOMNodeList;
    tempNode xmldom.DOMNode;
    tempArrMap xmldom.DOMNamedNodeMap;

    pid     VARCHAR2(4);
    NAME    VARCHAR2(50);
    address VARCHAR2(200);
    tel     VARCHAR2(20);
    fax     VARCHAR2(20);
    email   VARCHAR(100);
    tmp     INTEGER;
    

    BEGIN
    SELECT t.stringdata, dbms_lob.getLength(t.stringdata)
    INTO lob_data, lob_size
    FROM receivelog t
    WHERE t.applkey = 'A2011062400000000900003'
    AND t.isoutbound = '0';

    xmlPar := xmlparser.newParser;
    xmlparser.parseClob(xmlPar,lob_data); 
    doc := xmlparser.getDocument(xmlPar);
    xmlparser.freeParser(xmlPar);
    personNodes := xmldom.getElementsByTagName(doc, 'PERSON');
    len         := xmldom.getLength(personNodes);
    FOR i IN 0 .. len - 1 LOOP
        tempNode := xmldom.item(personNodes, i);
        tempArrMap := xmldom.getAttributes(tempNode);
        pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap, 'PERSONID'));
        chilNodes := xmldom.getChildNodes(tempNode);
        tmp       := xmldom.GETLENGTH(chilNodes);
        NAME      := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 0)));
        address   := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 1)));
        tel       := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 2)));
        fax       := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 3)));
        email     := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 4)));
        DBMS_OUTPUT.PUT_LINE(email);
    END LOOP;
    xmldom.freeDocument(doc);
    

    EXCEPTION
    WHEN OTHERS THEN
    DBMS_output.PUT_LINE(SQLERRM);
    END readLob;
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题