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

Откуда:
Сообщений: 52
Доброго времени суток, уважаемые форумчане!
2 окт 17, 11:48    [20835851]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в две таблицы  [new]
ultrasonic7
Member

Откуда:
Сообщений: 52
Есть две таблицы:
create table schematest.dept
(
  deptno  number,
  loc varchar2(100 char),
  dname varchar2(100 char)
);

create table schematest.emp
(
  deptno  number,
  empno  number,
  ename varchar2(100 char),
  sal number
);


и код, который должен создавать объект типа XMLType, а затем раскидывать содержимое этого объекта по двум этим таблицам.
declare
xml_var XMLType;
begin
  select XMLType('
  <rowset>
    <employee>
      <deptno>40</deptno>
      <empno>1111</empno>
      <ename>Queen</ename>
      <sal>7000</sal>
    </employee>
    <department>
      <deptno>50</deptno>
      <dname>MARKETING</dname>
      <loc>MOSCOW</loc>
    </department>
    <employee>
      <deptno>40</deptno>
      <empno>2222</empno>
      <ename>Duke</ename>
      <sal>4000</sal>
    </employee>
    <employee>
      <deptno>50</deptno>
      <empno>3333</empno>
      <ename>Earl</ename>
      <sal>6000</sal>
    </employee>
  </rowset>
  ') into xml_var 
  from dual;

  INSERT FIRST
  WHEN empno IS NULL THEN INTO SCHEMATEST.dept ( deptno, dname, loc )
                                        VALUES ( deptno, dname, loc )
  WHEN empno IS NOT NULL THEN INTO SCHEMATEST.emp ( empno, ename, sal, deptno )
                                           VALUES ( empno, ename, sal, deptno )
   
  SELECT  y.dname
        , y.loc
        , y.deptno
        , y.empno
        , y.ename
        , y.sal
  FROM XMLTABLE ('for $i in /ROWSET/(employee|department) return $i'
                 PASSING xml_var
                 COLUMNS   dname   varchar2(100 char) PATH '/department/dname'
                         , loc     VARCHAR2(100 char) PATH '/department/loc' 
                         , deptno  number PATH './deptno'
                         , empno   NUMBER PATH '/employee/empno'
                         , ename   varchar2(100 char) PATH '/employee/ename'
                         , sal     NUMBER PATH '/employee/sal'
                 ) AS y;

  EXCEPTION 
    WHEN NO_DATA_FOUND THEN  DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
    WHEN TOO_MANY_ROWS THEN  DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS'); 
end;

Но в результате строки в таблицы не попадают. Где может скрываться ошибка?
2 окт 17, 11:57    [20835885]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в две таблицы  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5598
ultrasonic7,

XPath is case sensitive
2 окт 17, 12:01    [20835916]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в две таблицы  [new]
ultrasonic7
Member

Откуда:
Сообщений: 52
Спасибо, env. Я rowset в нижний регистр перевести забыл.
2 окт 17, 12:12    [20835956]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в две таблицы  [new]
ultrasonic7
Member

Откуда:
Сообщений: 52
А в этой строке
for $i in /rowset/(employee|department) return $i
, как я понимаю, объявляется некий цикл по набору. Где бы почитать про синтаксис циклов for..in в XPath?
2 окт 17, 13:44    [20836285]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в две таблицы  [new]
XMLer
Member

Откуда:
Сообщений: 154
ultrasonic7
А в этой строке
for $i in /rowset/(employee|department) return $i
, как я понимаю, объявляется некий цикл по набору. Где бы почитать про синтаксис циклов for..in в XPath?

зачем тебе цикл? для того чтобы выбрать все дочерние элементы xquery не требуется, достаточно xpath
2 окт 17, 14:25    [20836416]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить