[英]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><Rank>1</Rank><airport>Hartsfield-Jackson</airp
默認情況下, XMLElement()會轉義傳入值中的實體,因此尖括號將被轉換為“安全”等價物,例如<
。 如果它沒有執行此操作,或者您沒有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.