XMLType pl / sql добавить дочерний - PullRequest
1 голос
/ 20 марта 2012

У меня проблема с правильным добавлением дочерних элементов из pl / sql в структуру xml, как показано ниже.

  <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 = mushroom.Когда я делаю что-то подобное:

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>'))

Я добавляю нового ребенка для всех семей.Как я могу добавить CHILD_DATA только для lname = mushroom.Вопрос № 2. Как мне сосчитать CHILD_DATA для семьи?

1 Ответ

1 голос
/ 20 марта 2012

Настройте таблицу и вставьте данные (не то чтобы я предполагаю, что ваши фактические данные заканчиваются тегом </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> /

Вы можете использовать following-sibling в вашем XPath(хотя было бы гораздо более логичным изменить определение вашего 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...