2015-04-23 4 views
3

У меня проблема с вставкой xmltype в другой xmltype в указанном месте в pl/sql.Вставить xmltype в xmltype в указанном месте [PL/SQL]

Первая переменная v_xml имеет вид:

<ord> 
    <head> 
    <ord_code>123</ord_code> 
    <ord_date>01-01-2015</ord_date> 
    </head> 
</ord> 

И второй v_xml2:

<pos> 
    <pos_code>456</pos_code> 
    <pos_desc>description</pos_desc> 
</pos> 

Моя цель получить что-то вроде этого:

<ord> 
    <head> 
    <ord_code>123</ord_code> 
    <ord_date>01-01-2015</ord_date> 
    </head> 
    <!-- put the second variable in this place - after closing <head> tag --> 
    <pos> 
    <pos_code>456</pos_code> 
    <pos_desc>description</pos_desc> 
    </pos> 
</ord> 

Что Шоуда я с мой код?

declare 
    v_xml xmltype; 
    v_xml2 xmltype; 
begin 
    -- some code 
    -- some code 
    -- v_xml and v_xml2 has the form as I define above 
end; 

Может ли кто-нибудь помочь мне с этой проблемой? Как я знаю, есть такие функции, как insertchildxml, appendchildxml или что-то вроде этого ... Я нашел несколько решений в чистом SQL, но я не знаю, как их переместить в PL/SQL.

Спасибо!

ответ

2

Вы можете использовать упомянутый appendChildXML, как здесь:

declare 
    v_xml xmltype := xmltype('<ord> 
           <head> 
           <ord_code>123</ord_code> 
           <ord_date>01-01-2015</ord_date> 
           </head> 
          </ord>'); 
    v_xml2 xmltype:= xmltype('<pos> 
           <pos_code>456</pos_code> 
           <pos_desc>description</pos_desc> 
          </pos>'); 
    v_output xmltype; 
begin 
    select appendChildXML(v_xml, 'ord', v_xml2) 
    into v_output from dual; 

    -- output result 
    dbms_output.put_line(substr(v_output.getclobval(), 1, 1000)); 
end; 

Выход:

<ord> 
    <head> 
    <ord_code>123</ord_code> 
    <ord_date>01-01-2015</ord_date> 
    </head> 
    <pos> 
    <pos_code>456</pos_code> 
    <pos_desc>description</pos_desc> 
    </pos> 
</ord> 
+0

Спасибо за ваше время, это работает! :) – llepec

2

appendChildXML осуждается 12,1

Так вот это решение с использованием XMLQuery

DECLARE 

    l_head_xml XMLTYPE := XMLTYPE.CREATEXML('<ord> 
               <head> 
                <ord_code>123</ord_code> 
                <ord_date>01-01-2015</ord_date> 
               </head> 
               </ord>'); 

    l_pos_xml XMLTYPE := XMLTYPE.CREATEXML('<pos> 
               <pos_code>456</pos_code> 
               <pos_desc>description</pos_desc> 
              </pos>'); 

    l_complete_xml XMLTYPE; 

BEGIN 

    SELECT XMLQUERY('for $i in $h/ord/head 
        return <ord> 
          {$i} 
          {for $j in $p/pos 
          return $j}         
          </ord>'                   
        PASSING l_head_xml AS "h", 
          l_pos_xml AS "p" 
        RETURNING CONTENT) 
    INTO l_complete_xml 
    FROM dual; 

    dbms_output.put_line(l_complete_xml.getstringval()); 

END; 
+0

Ian - Если имеет атрибуты, не могли бы вы объяснить, как вы их также возвращаете? –

Смежные вопросы