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

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

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]

通过oracle中的DBMS_LOB.READ读取lob对象,然后解析xml.

读取lob的代码很多,你搜索下 DBMS_LOB

解析xml:http://www.blogjava.net/botson/archive/2008/03/19/187360.html