xml 文件是 以blob 数据类型存储在 数据库,请问用存储过程的 方式解析出来怎么解析?
提示:只能用存储过程,不用java代码。
知道或者做过的 请告诉解决方法,感激不尽!
1.解析xml需要oracle xml db,先看看是否安装
[code="sql"]
SQL> SELECT comp_name "Component" from dba_registry;
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