--------------------------方法一-------------------------------------

1.xml字符串

/*

<orderlist>
        <order>
        <orderid>1</orderid>
        <ordernumber>857544544</ordernumber>
        <orderprice>54</orderprice>
        </order>
        
        <order>
        <orderid>2</orderid>
        <ordernumber>858544544</ordernumber>
        <orderprice>63</orderprice>
        </order>
        
        <order>
        <orderid>3</orderid>
        <ordernumber>454854555</ordernumber>
        <orderprice>781</orderprice>
        </order>        
</orderlist>

*/

2.oracle存储过程

CREATE OR REPLACE PROCEDURE p_xmlparse (p_xml   IN     CLOB,
                                                                     r_cur      OUT SYS_REFCURSOR)  
        AS  
           /***  
           xml格式<?xml version="1.0" encoding="utf-8"?>  
           <material id="101">  
               <attribute0>value0</attribute0>  
               <attribute1>value1</attribute1>  
               <attribute2>value2</attribute2>  
           </material>  
           ***/  
        -- xml解析器  
           xmlpar          xmlparser.parser := xmlparser.newparser;  
        -- dom文档对象  
           doc             xmldom.domdocument;  
           materialnodes   xmldom.domnodelist;  
           materialid      VARCHAR2 (50);  
           chilnodes       xmldom.domnodelist;  
           tempnode        xmldom.domnode;  
           temparrmap      xmldom.domnamednodemap;  
        -- 以下变量用于获取xml节点的值  
           v_attribute     VARCHAR2 (50);  
           v_value         VARCHAR2 (50);  
           tmp             INTEGER;  
           l_sql           VARCHAR2 (32767) := 'select ';  
        BEGIN  
           xmlparser.parseclob (xmlpar, p_xml);  
           doc := xmlparser.getdocument (xmlpar);  
        -- 释放解析器实例  
           xmlparser.freeparser (xmlpar);  
           materialnodes := xmldom.getelementsbytagname (doc, 'material');  
           tempnode := xmldom.item (materialnodes, 0);  
        -- 获取根元素的ID属性值  
           materialid := xmldom.getattribute (xmldom.getdocumentelement (doc), 'id');  
        -- 所有属性  
           temparrmap := xmldom.getattributes (tempnode);  
        -- 获取子元素的值  
           chilnodes := xmldom.getchildnodes (tempnode);  
           tmp := xmldom.getlength (chilnodes);  
           l_sql := l_sql || materialid || ' as materialid';  
        FOR i IN 0 .. tmp - 1  
           LOOP  
              v_attribute := xmldom.getnodename (xmldom.item (chilnodes, i));  
              v_value :=  
                 xmldom.getnodevalue (  
                    xmldom.getfirstchild (xmldom.item (chilnodes, i)));  
              l_sql := l_sql || ',''' || v_value || ''' as ' || v_attribute;  
        -- dbms_output.put_line(materialid||' '||v_attribute||' '||v_value);  
        END LOOP;  
           l_sql := l_sql || ' from dual';  
        -- DBMS_OUTPUT.put_line (l_sql);  
        OPEN r_cur FOR l_sql;  
        -- 释放文档对象  
           xmldom.freedocument (doc);  
        EXCEPTION  
        WHEN OTHERS  
        THEN  
              DBMS_OUTPUT.put_line (SQLERRM);  
        END p_xmlparse;

3.执行结果

源文档地址:http://blog.csdn.net/wzy0623/article/details/8245062

--------------------------方法二-------------------------------------

SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING
    XMLTYPE('<?xml version="1.0" encoding="gb2312" ?>&xml') AS B
    COLUMNS USER_DEAL_ID VARCHAR2(50) PATH
    '/USER_DEAL_INFO/USER_DEAL_ID',
    DEAL_INURE_TIME VARCHAR2(50) PATH
    '/USER_DEAL_INFO/DEAL_INURE_TIME',
    DEAL_EXPIRE_TIME VARCHAR2(50) PATH
    '/USER_DEAL_INFO/DEAL_EXPIRE_TIME',
    DEAL_CREATE_TIME VARCHAR2(50) PATH
    '/USER_DEAL_INFO/DEAL_CREATE_TIME')

xml字符串以传入参数的方式 输入

<DEAL_BASIC>
   <USER_DEAL_INFO>
   <USER_DEAL_ID>1000100001</USER_DEAL_ID>
   <DEAL_INURE_TIME>20081130</DEAL_INURE_TIME>
   <DEAL_EXPIRE_TIME>30000101</DEAL_EXPIRE_TIME>
   <DEAL_CREATE_TIME>20081130</DEAL_CREATE_TIME>
   </USER_DEAL_INFO>   
   <USER_DEAL_INFO>
   <USER_DEAL_ID>1000100002</USER_DEAL_ID>
   <DEAL_INURE_TIME>20081131</DEAL_INURE_TIME>
   <DEAL_EXPIRE_TIME>30000102</DEAL_EXPIRE_TIME>
   <DEAL_CREATE_TIME>20081131</DEAL_CREATE_TIME>
   </USER_DEAL_INFO>
     <USER_DEAL_INFO>
   <USER_DEAL_ID>1000100002</USER_DEAL_ID>
   <DEAL_INURE_TIME>20081131</DEAL_INURE_TIME>
   <DEAL_EXPIRE_TIME>30000102</DEAL_EXPIRE_TIME>
   <DEAL_CREATE_TIME>20081131</DEAL_CREATE_TIME>
   </USER_DEAL_INFO>
</DEAL_BASIC>

输出结果

ORACLE 解析xml字符串-转载的的更多相关文章

  1. oracle解析xml完成版第二次修改

    其实XML字符串就好像是ORACLE中的外部表,因此Oracle对 解析XML字符串一些规则要求非常严格.XML字符串提供的数据就是一张表,所以Oracle必须提供跟 xml数据一致的列头 示例一 S ...

  2. tinyXml直接解析XML字符串

    一直都用tinyxml直接LoadFile来解析XML,发现原来也可以直接解析XML字符串. XML文件: <?xml version=\"1.0\" encoding=\& ...

  3. Oracle解析 xml 记录一下(未完待续)

    Oracle解析 xml 记录一下. SQL> desc xmlparser; PROCEDURE FREEPARSER Argument Name                  Type  ...

  4. 解析xml字符串时报“前言中不允许有内容”错误。

    一,问题出现经过: j基于java语言webservic服务端接收客户端 传来的xml字符串用 解析时总报:org.dom4j.DocumentException: Error on line 1 o ...

  5. dom4j解析xml字符串实例

    DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml ...

  6. java解析xml字符串(用dom4j)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  7. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  8. .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表

    /// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...

  9. C++解析XML字符串

    项目交互遇到了需要VC++中解析XML字符串,故花了点时间了解了下VC++中解析XML的诸多方法主要包括三种:msxml(微软提供).markup.TinyXml. 开始花了点时间使用msxml3,虽 ...

随机推荐

  1. MYSQL查看和修改存储引擎

    最近,公司的BBS压力越来越大,表死锁越来越严重. 在其它优化同作的情况下,MYISAM引擎转为INNODB引擎也纳入计划当中. 参考URL如下:简单,但要注意备份... ============ h ...

  2. keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)

    转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...

  3. 从VC到g++遇到的事

    最近做的项目,需要把代码从VC移植到g++下编译,在这个过程中,遇到了几个平台相关的问题--在VC下顺利编译的代码,但在g++中编译报错. 这里贴出来给大家分享一下: 1. 枚举类型 问题代码 enu ...

  4. bzoj3275

    容易想到是最小割(最大权独立集)然后每个数拆成两个点,不能同时选的之间连边跑最小割,最后答案=总数-mincut/2 因为这样建图将流量变成了原来的两倍 当然这道题更好的建图方法是分成奇数和偶数两个集 ...

  5. Qt入门(10)——调试技术

    命令行参数当你运行Qt程序时,你可以指定几个命令行参数来帮助你调试.-nograb 应用程序不再捕获鼠标或者键盘.当程序在Linux下运行在gdb调试器中时这个选项是默认的.-dograb 忽略任何隐 ...

  6. 数学概念——I - 数论,线性方程

    I - 数论,线性方程 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. UNIX环境下的共享内存

    好久没更新博客了,最近几个月一直在忙项目,现在终于有时间进一步学习了.这次记录的是unix环境中共享内存的使用方法.  在我理解,共享内存就是在内存中开辟一段空间,各个毫不相干的进程就可以通过访问这段 ...

  8. 424. Longest Repeating Character Replacement

    以最左边为开始,往右遍历,不一样的个数大于K的时候停止,回到第一个不一样的地方,以它为开始,继续.. 用QUEUE记录每次不一样的INDEX,以便下一个遍历开始, 从左往右,从右往左各来一次..加上各 ...

  9. angularJS constant和value

    angularJS可以通过constant(name,value)和value(name,value)对于创建服务也是很重要的. 相同点是:都可以接受两个参数,name和value. 区别: 1.co ...

  10. DB2 创建数据库

    0.一些准备工作可能用到的命令 db2cmd --进入db2命令行 db2 list database directory --显示已有的数据库 db2 drop db pcore --删除一个数据库 ...