Как вставить данные с помощью курсора в новую таблицу с одним столбцом, содержащим данные типа XML в Oracle? - PullRequest
0 голосов
/ 06 ноября 2018

Я могу вставить значения в таблицу 2 из таблицы 1 и успешно выполнить процедуру PL / SQL, но результат получается неуклюжим. Я не знаю почему?

Ниже приведен код:

 create table airports_2_xml
 (
    airport xmltype
 );

 declare
 cursor insert_xml_cr is select * from airports_1_orcl;

  begin
  for i in insert_xml_cr
  loop
      insert into airports_2_xml values
      (
           xmlelement("OneAirport",
           xmlelement("Rank", i.Rank) ||
           xmlelement("airport",i.airport) ||
           xmlelement("Location",i.Location) || 
           xmlelement("Country", i.Country) ||
           xmlelement("Code_iata",i.code_iata) || 
           xmlelement("Code_icao", i.code_icao) ||
           xmlelement("Total_Passenger",i.Total_Passenger) ||
           xmlelement("Rank_change", i.Rank_change) ||
           xmlelement("Percent_Change", i.Percent_change)
    ));
  end loop;
 end;
 /

select * from airports_2_xml;   

Выход:

Result

Почему в выводе отображается & lt, & gt? И почему я не могу увидеть вывод полностью?

Ожидаемый результат:

      <OneAirport>
         <Rank>3</Rank>
         <Airport>Dubai International</Airport>
        <Location>Garhoud</Location>
        <Country>United Arab Emirates</Country>
        <Code_IATA>DXB</Code_IATA>
       <Code_ICAO>OMDB</Code_ICAO>
        <Total_passenger>88242099</Total_passenger>
       <Rank_change>0</Rank_change>
        <Percent_Change>5.5</Percent_Change>
      </OneAirport>

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Основная проблема заключается в том, как вы создаете XML. У вас есть внешний XMLElement для OneAirport, и содержимое этого элемента представляет собой одну строку.

Вы генерируете отдельные элементы XMLE из полей курсора, но затем объединяете их вместе, что дает вам одну строку, в которой все еще есть ожидаемые угловые скобки. Итак, вы пытаетесь сделать что-то вроде, немного упростил:

select
xmlelement("OneAirport", '<Rank>1</Rank><airport>Hartsfield-Jackson</airport>')
from dual;

    XMLELEMENT("ONEAIRPORT",'<RANK>1</RANK><AIRPORT>HARTSFIELD-JACKSON</AIRPORT>')  
--------------------------------------------------------------------------------
<OneAirport>&lt;Rank&gt;1&lt;/Rank&gt;&lt;airport&gt;Hartsfield-Jackson&lt;/airp

и по умолчанию XMLElement () экранирует сущности в переданных значениях, поэтому угловые скобки преобразуются в «безопасные» эквиваленты, такие как &lt;. Если он этого не сделал или вы сказали это не с noentityescaping:

select xmlelement(noentityescaping "OneAirport", '<Rank>1</Rank><airport>Hartsfield-Jackson</airport>')
from dual;

XMLELEMENT(NOENTITYESCAPING"ONEAIRPORT",'<RANK>1</RANK><AIRPORT>HARTSFIELD-JACKS
--------------------------------------------------------------------------------
<OneAirport><Rank>1</Rank><airport>Hartsfield-Jackson</airport></OneAirport>

тогда это может показаться лучше, но у вас все еще есть один элемент с одной строкой (с символами, которые могут вызвать проблемы в дальнейшем), а не структура XML, которую вы почти наверняка намеревались.

Простой способ получить структуру zctual - это XMLForest () :

xmlelement("OneAirport",
  xmlforest(i.Rank, i.airport, i.Location, i.Country, i.code_iata,
    i.code_icao, i.Total_Passenger, i.Rank_change, i.Percent_change)
)

Вам не нужен цикл курсора или какой-либо PL / SQL; Вы можете просто сделать:

insert into airports_2_xml (airport)
select xmlelement("OneAirport",
  xmlforest(i.Rank, i.airport, i.Location, i.Country, i.code_iata,
    i.code_icao, i.Total_Passenger, i.Rank_change, i.Percent_change)
  )
from airports_1_orcl i;

Вторая проблема - это дисплей. Вы увидите больше данных, если выполните некоторые команды форматирования, такие как:

set lines 120
set long 32767
set longchunk 32767

Они сообщат вашему клиенту, что нужно извлечь и показать больше длинных (здесь XMLType) данных, а не 80 символов по умолчанию, которые он вам дает сейчас.

После создания вложенной структуры XML вы можете использовать XMLSerialize () , чтобы отобразить ее более читабельно при запросе второй таблицы.

0 голосов
/ 06 ноября 2018

Попробуйте этот блок ниже:

declare
 cursor insert_xml_cr is select * from airports_1_orcl;
v_airport_xml SYS.XMLTYPE;
  begin
  for i in insert_xml_cr
  loop

  SELECT XMLELEMENT ( "OneAirport",
                             XMLFOREST(i.Rank as "Rank"
                                      ,i.airport as "Airport"
                                      ,i.Location as "Location"
                                      ,i.Country as "Country"
                                      ,i.code_iata as "Code_iata"
                                      ,i.code_icao as "code_icao"
                                      ,i.Total_Passenger as  "Total_Passenger" 
                                      , i.Rank_change as "Rank_change"
                                      ,i.Percent_change as "Percent_Change"
                                      ))
                                       into v_airport_xml
                                              FROM DUAL;

                        insert into airports_2_xml values (v_airport_xml);

  end loop;
 end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...