繁体   English   中英

如何在Oracle中使用游标将数据插入具有包含XML类型数据的单列的新表中?

[英]How to Insert data using cursor into new table having single column containing XML type data in Oracle?

我能够将值从表1插入表2并成功执行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;   

输出:

结果

为什么它在输出中显示&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>

主要问题是如何构造XML。 您具有一个用于OneAirport的外部XMLElement,并且该元素的内容是单个字符串。

您正在从游标字段生成单个XMLElement,但是随后将它们浓缩在一起,这将为您提供单个字符串,并且仍然具有您期望的尖括号。 所以您正在尝试做一些简化的事情:

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()将其显示为更具可读性。

在下面的块中尝试:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM