暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle管理XML的函数

数据老匠 2016-08-20
458


实验表:

create table xtab(

fid         number,

fcontent   xmltype

);

实验数据:

        insert into xtab values(1,

                            xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '        <item><id>2</id><val>ms</val></item>' ||

         '</items>');

************************************************

appendchildxml:

        功能:增加xmltype对象的节点

        语法:appendchildxml(xmltype,node_path,sub_xmltype)

        node_path:表示要增加节点的上一层路径

        sub_xmltype:增加的节点为一个xmltype对象

        返回值:得到增加了节点后的xmltype对象

实验:增加xmltype对象的节点

  procedure p10 is

    v_xml   xmltype;

    v_val   xmltype;

  begin

    v_xml := xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '        <item><id>2</id><val>ibm</val></item>' ||

          '</items>');

select appendchildxml(v_xml,'/items/item',

xmltype('<city>shenzhen</city>'))

      into v_val

      from dual;

    dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

     <item><id>1</id><val>oracle</val><city>shenzhen</city></item>

     <item><id>2</id><val>ibm</val><city>shenzhen</city></item>

  </items>

************************************************

deletexml:

        功能:删除xmltype对象的某些节点

        语法:deletexml(xmltype,node_path)

        node_path:表示xml文件中某个节点的路径

        返回值:得到删除了节点后的xmltype对象

实验:得到删除xmltype对象的某些节点后,新的xmltype对象

  procedure p9 is

    v_xml   xmltype;

    v_val   xmltype;

  begin

    v_xml := xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '        <item><id>2</id><val>ibm</val></item>' ||

          '</items>');

    select deletexml(v_xml,'/items/item/val')

      into v_val

      from dual;

    dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

    <item>

       <id>1</id>

    </item>

    <item>

      <id>2</id>

    </item>

  </items>

************************************************

existsnode:

        功能:判断xmltype对象的某个节点是否存在

        语法:existsnode(xmltype,node_path)

        node_path:表示xml文件中某个节点的路径

        返回值:1表示存在,0表示不存在

实验:查询某的xmltype字段是否有某个节点

        select existsnode(x.fcontent,'/items/item') from xtab x;

实验:查看某个变量是否有某个节点

  procedure p1 is

    v_xml    xmltype;

    v_exists number;

  begin

    v_xml := xmltype('<items>' ||

                     '   <item><id>1</id><val>apple</val></item>' ||

                     '   <item><id>1</id><val>apple</val></item>' ||

                     '</items>');

    select existsnode(v_xml, '/items/item/id') into v_exists from dual;

dbms_output.put_line(v_exists); 

  end;

实验输出:1

************************************************

extractvalue:

        功能:得到xmltype对象某个节点的数值

        语法:extractvalue(xmltype,node_path)

        node_path:表示xml文件中某个节点的路径

        注意:node_path路径在整个xmltype对象中必须是唯一的

        返回值:得到该唯一节点的数值

实验:得到xmltype对象某个节点的数值

  procedure p1 is

    v_xml   xmltype;

    v_id    number;

  begin

    v_xml := xmltype.createxml(

                    '<items>' ||

                    '        <item><id >1</id><val>oracle</val></item>' ||

                    '</items>');

    select to_number(extractvalue(v_xml,'/items/item/id'))

      into v_id

      from dual;

    dbms_output.put_line(v_id);

  end;

实验输出:1

************************************************

extract:

        功能:得到xmltype对象某些节点的数值

        语法:extract(xmltype,node_path)

        node_path:表示xml文件中某个节点的路径

        返回值:得到这些节点组成的xmltype对象

实验:得到xmltype对象某些节点的数值

  procedure p1 is

    v_xml   xmltype;

    v_val   xmltype;

  begin

    v_xml := xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '        <item><id>2</id><val>ibm</val></item>' ||

          '</items>');

    select extract(v_xml,'/items/item/val')

      into v_val

      from dual;

    dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <val>oracle</val>

  <val>ibm</val>

************************************************

insertchildxml:

        功能:增加xmltype对象的节点

        语法:insertchildxml(xmltype,node_path,node_name,sub_xmltype)

        node_path:表示要增加节点的上一层路径

        node_name:表示要增加的节点的名称

        sub_xmltype:增加的节点为一个xmltype对象

        返回值:得到删除了节点后的xmltype对象

实验:增加xmltype对象的节点

  procedure p10 is

    v_xml   xmltype;

    v_val   xmltype;

  begin

    v_xml := xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '        <item><id>2</id><val>ibm</val></item>' ||

          '</items>');

select insertchildxml(v_xml,'/items/item','city',

xmltype('<city>shenzhen</city>'))

      into v_val

      from dual;

    dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

     <item><id>1</id><val>oracle</val><city>shenzhen</city></item>

     <item><id>2</id><val>ibm</val><city>shenzhen</city></item>

  </items>

************************************************

insertchildxmlafter:

        功能:向xmltype对象中某个层次节点之后增加一个元素

        语法:insertchildxmlafter(xmltype,node_path,node, sub_xmltype)

        node_path:添加元素节点的路径

        node:添加元素节点的具体位置

        sub_xmltype:表示添加的子元素节点

        after:表示在指定的节点元素后面增加一个节点元素

实验:向xmltype对象中某个层次节点增加一个元素

    procedure p1 is

        v_xml xmltype;

        v_val xmltype;

    begin

        v_xml := xmltype.createxml(

                 '<items>' ||

                 '        <item><id>1</id><val>oracle</val></item>' ||

                 '        <item><id>2</id><val>ibm</val></item>' ||

                 '</items>');

        select insertchildxmlafter(v_xml,

                              '/items/item[2]',

                              'id',

                              xmltype('<city>shenzhen</city>'))

        into   v_val

        from   dual;

        dbms_output.put_line(to_char(v_val.getclobval()));

    end;

实验输出:

  <items>

    <item><id>1</id><val>oracle</val></item>

    <item><id>2</id><city>shenzhen</city><val>ibm</val></item>

  </items>

************************************************

insertchildxmlbefore:

        功能:向xmltype对象中某个层次节点之前增加一个元素

        语法:insertchildxmlbefore(xmltype,node_path,node, sub_xmltype)

        node_path:添加元素节点的路径

        node:添加元素节点的具体位置

        sub_xmltype:表示添加的子元素节点

        after:表示在指定的节点元素后面增加一个节点元素

实验:向xmltype对象中某个层次节点之前增加一个元素

    procedure p2 is

        v_xml xmltype;

        v_val xmltype;

    begin

        v_xml := xmltype.createxml(

                 '<items>' ||

                 '        <item><id>1</id><val>oracle</val></item>' ||

                 '        <item><id>2</id><val>ibm</val></item>' ||

                 '        <item><id>3</id><val>ms</val></item>' ||

                 '</items>');

        select insertchildxmlbefore(v_xml,

                              '/items/item[1]',

                              'id',

                              xmltype('<city>shenzhen</city>'))

        into   v_val

        from   dual;

        dbms_output.put_line(to_char(v_val.getclobval()));

    end;

实验输出:

  <items>

    <item><city>shenzhen</city><id>1</id><val>oracle</val></item>

    <item><id>2</id><val>ibm</val></item>

    <item><id>3</id><val>ms</val></item>

  </items>

************************************************

insertxmlafter:

        功能:在指定节点后增加xmltype对象的节点

        语法:insertxmlafter(xmltype,node_path,sub_xmltype)

        node_path:表示要增加节点的上一层路径

        sub_xmltype:增加的节点为一个xmltype对象

        返回值:得到增加了节点后的xmltype对象

        注意:通过下标来标示node_path表示的具体对象,该对象必须是一个可独立为xmltype对象的节点

实验:增加xmltype对象的节点

  procedure p10 is

      v_xml xmltype;

      v_val xmltype;

  begin

      v_xml := xmltype.createxml('<items>' ||

            '        <item><id>1</id><val>oracle</val></item>' ||

            '        <item><id>2</id><val>ibm</val></item>' ||

            '</items>');

      select insertxmlafter(v_xml,

              '/items/item[2]',

              xmltype('<city>shenzhen</city>'))

      into   v_val

      from   dual;

      dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

      <item><id>1</id><val>oracle</val></item>

      <item><id>2</id><val>ibm</val></item>

      <city>shenzhen</city>

  </items>

************************************************

insertxmlbefore:

        功能:在指令节点前增加xmltype对象的节点

        语法:insertxmlbefore(xmltype,node_path,sub_xmltype)

        node_path:表示要增加节点的上一层路径

        sub_xmltype:增加的节点为一个xmltype对象

        返回值:得到增加了节点后的xmltype对象

        注意:通过下标来标示node_path表示的具体对象,该对象必须是一个可独立为xmltype对象的节点

实验:增加xmltype对象的节点

  procedure p3 is

      v_xml xmltype;

      v_val xmltype;

  begin

      v_xml := xmltype.createxml('<items>' ||

             '        <item><id>1</id><val>oracle</val></item>' ||

             '        <item><id>2</id><val>ibm</val></item>' ||

             '        <item><id>3</id><val>ms</val></item>' ||            

             '</items>');

      select insertxmlbefore(v_xml,

              '/items/item[2]',

              xmltype('<city>shenzhen</city>'))

      into   v_val

      from   dual;

      dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

    <item><id>1</id><val>oracle</val></item>

    <city>shenzhen</city>

    <item><id>2</id><val>ibm</val></item>

    <item><id>3</id><val>ms</val></item>

  </items>

************************************************

updatexml:

        功能:更新xmltype对象某些节点的数值

        语法:updatexml(xmltype,node_path,new_value)

        node_path:表示xml文件中某个节点的路径

        返回值:得到节点数值更新后的xmltype对象

实验:得到更新xmltype对象后某些节点的数值

  procedure p8 is

    v_xml   xmltype;

    v_val   xmltype;

  begin

    v_xml := xmltype.createxml(

          '<items>' ||

          '        <item><id>1</id><val>oracle</val></item>' ||

          '</items>');

    select updatexml(v_xml,'/items/item/val/text()','ms')

      into v_val

      from dual;

    dbms_output.put_line(to_char(v_val.getclobval()));

  end;

实验输出:

  <items>

    <item>

      <id>1</id>

      <val>ms</val>

    </item>

  </items>


文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论