Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 XML в SQL  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
Есть XML такой структуры:
<?xml version="1.0"?>
<parent_list>
  <parent>
    <p_name>Первый</p_name>,
    <child_list>
      <child>
        <c_id>11<c_id>
	<c_name>Один-Один<c_name>
      </child>
      <child>
	<c_id>12<c_id>
	<c_name>Один-Два<c_name>
      </child>
    </child_list>
  </parent>
  <parent>
    <p_name>Второй</p_name>,
    <child_list>
      <child>
	<c_id>21<c_id>
	<c_name>Два-Один<c_name>
      </child>
      <child>
        <c_id>22<c_id>
	<c_name>Два-Два<c_name>
      </child>
      <child>
	<c_id>23<c_id>
	<c_name>Два-Три<c_name>
      </child>
    </child_list>
  </parent>
</parent_list>

Стоит задача разобрать этот XML и распихать данные по 2 таблицам (таблицы связаны 1:N):
TABLE1(t1_id, p_name)
TABLE2(t2_id, t1_id, c_id, c_name).
1 апр 11, 15:07    [10457445]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
ryasal,

ORA-19114: error during parsing the XQuery expression: 
LPX-00801: XQuery syntax error at '</child>'
14 </child>
- ^
1 апр 11, 15:12    [10457483]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
-2-
Member

Откуда:
Сообщений: 15330
ryasal,

insert when into ...
select ... from xmltable()
1 апр 11, 15:12    [10457489]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
Извините, выслал недописанный пост да еще и с ошибочным XML.
XML такой:
<?xml version="1.0"?>
<parent_list>
	<parent>
		<p_name>Первый</p_name>,
		<child_list>
			<child>
				<c_id>11</c_id>
				<c_name>Один-Один</c_name>
			</child>
			<child>
				<c_id>12</c_id>
				<c_name>Один-Два</c_name>
			</child>
		</child_list>
	</parent>
	<parent>
		<p_name>Второй</p_name>,
		<child_list>
			<child>
				<c_id>21</c_id>
				<c_name>Два-Один</c_name>
			</child>
			<child>
				<c_id>22</c_id>
				<c_name>Два-Два</c_name>
			</child>
			<child>
				<c_id>23</c_id>
				<c_name>Два-Три</c_name>
			</child>
		</child_list>
	</parent>
</parent_list>

Вопрос - как разобрать XML, чтоб в результирующем SQL было понятно, к какому t1_id нужно привязать запись в table2.

Я могу разобрать XML в SQL, получить все значения <p_name>, сделать для них записи в TABLE1.
Также могу получить все значения для всех <c_id> и <c_name>.
Но 2 этих запроса раздельны, из них нельзя понять, к какому t1_id относится <c_id> и <c_name>.

Использую такой запрос (для получения <p_name>):
SELECT *
  FROM XMLTable('/parent_list/parent'
                PASSING XMLType(_тут_мой_XML_)
                COLUMNS
                  p_name VARCHAR2(255) PATH 'p_name',
--                  c_id NUMBER PATH 'child_list/child/c_id',
                  lvl FOR ORDINALITY)
1 апр 11, 15:19    [10457563]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
Кхм, слишком путанно я написал.

1) Для каждого <parent> должна создаваться одна запись в таблице table1.
SELECT, который я привел вышел, для этого и предназначен.
Далее я планировал делать INSERT INTO table1 RETURNING t1_id.

2) Для каждого <parent> могут существовать от 0 до N <child>, для каждого из них должна создаваться запись в TABLE2. При этом нужно связать данные из table2 с данными table1, по ключу t1_id. Чтобы было понятно, что у этого родителя такие-то дочерние.

Но, в нодах узла <parent> нет никакого значения, которое бы четко идентифицировало этот parent. И в нодах <child> тоже нет значений, которые бы четко указали: <child> принадлежит <parent> такому-то.

Можно ли связать <child> и <parent>, не изменяя XML (не вводя в него искуственных id).
На крайний случай, структуру XML изменить можно.
1 апр 11, 15:35    [10457710]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 940
ryasal,
+ как то так...

SQL> select
  2  parentt.*
  3  ,childd.*
  4  from t
  5  ,xmltable('/parent_list/parent'
  6          PASSING x
  7          columns
  8          p_name VARCHAR2(255) PATH 'p_name',
  9          child_list xmltype path 'child_list'
 10          ) parentt
 11  ,xmltable('/child_list/child'
 12        PASSING parentt.child_list
 13        columns
 14          c_name VARCHAR2(255) PATH 'c_name',
 15          c_id varchar2(255) path 'c_id'
 16          ) childd
 17  /

P_NAME                         CHILD_LIST                     C_NAME               C_ID
------------------------------ ------------------------------ -------------------- ----------
Первый                         <child_list>                   Один-Один            11
                                 <child>
                                   <c_id>11</c_id>
                                   <c_name>Один-Один</c_name>

                                 </child>
                                 <child>
                                   <c_id>12</c_id>
                                   <c_name>Один-Два</c_name>
                                 </child>
                               </child_list>

Первый                         <child_list>                   Один-Два             12
                                 <child>
                                   <c_id>11</c_id>
                                   <c_name>Один-Один</c_name>

                                 </child>
                                 <child>
                                   <c_id>12</c_id>
                                   <c_name>Один-Два</c_name>
                                 </child>
                               </child_list>

Второй                         <child_list>                   Два-Один             21
                                 <child>
                                   <c_id>21</c_id>
                                   <c_name>Два-Один</c_name>
                                 </child>
                                 <child>
                                   <c_id>22</c_id>
                                   <c_name>Два-Два</c_name>
                                 </child>
                                 <child>
                                   <c_id>23</c_id>
                                   <c_name>Два-Три</c_name>
                                 </child>
                               </child_list>

Второй                         <child_list>                   Два-Два              22
                                 <child>
                                   <c_id>21</c_id>
                                   <c_name>Два-Один</c_name>
                                 </child>
                                 <child>
                                   <c_id>22</c_id>
                                   <c_name>Два-Два</c_name>
                                 </child>
                                 <child>
                                   <c_id>23</c_id>
                                   <c_name>Два-Три</c_name>
                                 </child>
                               </child_list>

Второй                         <child_list>                   Два-Три              23
                                 <child>
                                   <c_id>21</c_id>
                                   <c_name>Два-Один</c_name>
                                 </child>
                                 <child>
                                   <c_id>22</c_id>
                                   <c_name>Два-Два</c_name>
                                 </child>
                                 <child>
                                   <c_id>23</c_id>
                                   <c_name>Два-Три</c_name>
                                 </child>
                               </child_list>


Best regards

Maxim
1 апр 11, 16:05    [10457992]     Ответить | Цитировать Сообщить модератору
 Re: XML в SQL  [new]
ryasal
Member

Откуда: Россия
Сообщений: 152
Maxim Demenko,

Спасибо, это оно!
1 апр 11, 16:28    [10458215]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить