2012-03-20 49 views
1

我正确地将pl/sql中的孩子添加到xml结构中,如下所示。XMLType pl/sql添加孩子

<DATA> 
    <CHILDRENS> 
    <CHILDRENS_DEF lname="smith"> 
     <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
     <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
    </CHILDRENS_DEF> 
    <CHILDRENS_DATA> 
     <CHILD_DATA no="1"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Christopher</CHILD_COL_VALUE> 
     </CHILD_DATA> 
     <CHILD_DATA no="2"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Alice</CHILD_COL_VALUE> 
     </CHILD_DATA> 
     <CHILD_DATA no="3"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">John</CHILD_COL_VALUE> 
     </CHILD_DATA> 
    </CHILDRENS_DATA> 
    </CHILDRENS> 
    <CHILDRENS> 
    <CHILDRENS_DEF lname="mushroom"> 
     <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
     <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
    </CHILDRENS_DEF> 
    <CHILDRENS_DATA> 
     <CHILD_DATA no="1"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Arthur</CHILD_COL_VALUE> 
     </CHILD_DATA> 
    </CHILDRENS_DATA> 
    </CHILDRENS> 
</DATA> 

我想将孩子添加到CHILDRENS,其中CHILDRENS_DEF = lname =蘑菇。 当我做这样的事情:

UPDATE xml_childrens 
SET CLOBXMLCOL = INSERTCHILDXML(CLOBXMLCOL, 'DATA/CHILDRENS','CHILD_DATA', 
       XMLType('<CHILD_DATA no="2"> 
          <CHILD_COL_VALUE no="1" name="Id">2</CHILD_COL_VALUE> 
          <CHILD_COL_VALUE no="2" name="Fname">Adele</CHILD_COL_VALUE> 
         </CHILD_DATA>')) 

我给所有家庭添加新的孩子。我如何才能为lname =蘑菇添加CHILD_DATA。 问题2:我如何计算CHILD_DATA的家人?

+0

你对XML的定义有什么灵活性吗?如果'lname'是'CHILD_DATA'的某个父节点的属性,例如,看起来'CHILDRENS'节点定义了一个所以'lname'属于'CHILDRENS'的属性。 XPath表达式并不旨在向您显示具有符合某些条件的兄弟节点的节点。 – 2012-03-20 09:24:10

+0

我不能改变这个结构。因为这是移动设备导入数据的一部分。我想做一些程序,这将是从触发器调用自动生成这个XML。现在我手动操作: – dbuser 2012-03-20 09:51:53

回答

1

设置表和插入数据(不,我认为有</DATA>标签实际数据结束,因此,它是有效的XML

SQL> create table xml_children (
    2 xml_data xmltype 
    3 ); 

Table created. 


SQL> ed 
Wrote file afiedt.buf 

    1 insert into xml_children 
    2 values('<DATA> 
    3 <CHILDRENS> 
    4  <CHILDRENS_DEF lname="smith"> 
    5  <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
    6  <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
    7  </CHILDRENS_DEF> 
    8  <CHILDRENS_DATA> 
    9  <CHILD_DATA no="1"> 
10   <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
11   <CHILD_COL_VALUE no="2" name="Fname">Christopher</CHILD_COL_VALUE> 
12  </CHILD_DATA> 
13  <CHILD_DATA no="2"> 
14   <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
15   <CHILD_COL_VALUE no="2" name="Fname">Alice</CHILD_COL_VALUE> 
16  </CHILD_DATA> 
17  <CHILD_DATA no="3"> 
18   <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
19   <CHILD_COL_VALUE no="2" name="Fname">John</CHILD_COL_VALUE> 
20  </CHILD_DATA> 
21  </CHILDRENS_DATA> 
22 </CHILDRENS> 
23 <CHILDRENS> 
24  <CHILDRENS_DEF lname="mushroom"> 
25  <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
26  <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
27  </CHILDRENS_DEF> 
28  <CHILDRENS_DATA> 
29  <CHILD_DATA no="1"> 
30   <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
31   <CHILD_COL_VALUE no="2" name="Fname">Arthur</CHILD_COL_VALUE> 
32  </CHILD_DATA> 
33  </CHILDRENS_DATA> 
34 </CHILDRENS> 
35* </DATA>') 
SQL>/

你可以在你的XPath使用following-sibling(虽然这将是更合乎逻辑地改变你的XML的定义)

SQL> ed 
Wrote file afiedt.buf 

    1 update xml_children 
    2  set xml_data = InsertChildXML(xml_data, 
    3         '/DATA/CHILDRENS/CHILDRENS_DEF[@lname="mushroom"]/following-sibling::*', 
    4         'CHILD_DATA', 
    5         XMLType('<CHILD_DATA no="2"> 
    6        <CHILD_COL_VALUE no="1" name="Id">2</CHILD_COL_VALUE> 
    7        <CHILD_COL_VALUE no="2" name="Fname">Adele</CHILD_COL_VALUE> 
    8*       </CHILD_DATA>')) 
SQL>/

1 row updated. 

SQL> select * from xml_children; 

XML_DATA 
-------------------------------------------------------------------------------- 
<DATA> 
    <CHILDRENS> 
    <CHILDRENS_DEF lname="smith"> 
     <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
     <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
    </CHILDRENS_DEF> 
    <CHILDRENS_DATA> 
     <CHILD_DATA no="1"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Christopher</CHILD_COL_VALUE> 
     </CHILD_DATA> 
     <CHILD_DATA no="2"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Alice</CHILD_COL_VALUE> 
     </CHILD_DATA> 
     <CHILD_DATA no="3"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">John</CHILD_COL_VALUE> 
     </CHILD_DATA> 
    </CHILDRENS_DATA> 
    </CHILDRENS> 
    <CHILDRENS> 
    <CHILDRENS_DEF lname="mushroom"> 
     <CHILD_KOL no="1" name="Id" desc="Id" typ="NUMBER"/> 
     <CHILD_KOL no="2" name="Fname" desc="Fname" typ="VARCHAR2"/> 
    </CHILDRENS_DEF> 
    <CHILDRENS_DATA> 
     <CHILD_DATA no="1"> 
     <CHILD_COL_VALUE no="1" name="Id">1</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Arthur</CHILD_COL_VALUE> 
     </CHILD_DATA> 
     <CHILD_DATA no="2"> 
     <CHILD_COL_VALUE no="1" name="Id">2</CHILD_COL_VALUE> 
     <CHILD_COL_VALUE no="2" name="Fname">Adele</CHILD_COL_VALUE> 
     </CHILD_DATA> 
    </CHILDRENS_DATA> 
    </CHILDRENS> 
</DATA> 
1 row created. 
+0

非常好,非常感谢! – dbuser 2012-03-20 11:50:21

+0

你能回答我的第二个问题吗?我怎样才能算出CHILD_DATA的家庭?结果应该是史密斯家有3个孩子 – dbuser 2012-03-20 13:09:07