2012-03-20 61 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