xml 文件是 以blob 数据类型存储在 数据库,请问用存储过程的 方式解析出来怎么解析?
提示:只能用存储过程,不用java代码。
知道或者做过的 请告诉解决方法,感激不尽!
一个解析blob 数据类型的 xml 文件的存储过程,有谁碰到这种情况没?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 MATLAB动图问题
- ¥15 【提问】基于Invest的水源涵养
- ¥20 微信网友居然可以通过vx号找到我绑的手机号
- ¥15 寻一个支付宝扫码远程授权登录的软件助手app
- ¥15 解riccati方程组
- ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
- ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
- ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
- ¥50 树莓派安卓APK系统签名
- ¥65 汇编语言除法溢出问题