sql - 如何使用游标将数据插入到 Oracle 中具有包含 XML 类型数据的单列的新表中?
问题描述
我能够将值从表 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;
输出:
为什么它在输出中显示 < ,> ?为什么我无法完全看到输出?
预期输出:
<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。您有一个外部 XMLElement OneAirport
,并且该元素的内容是单个字符串。
您正在从游标字段生成单个 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()来显示更具可读性。
推荐阅读
- android - FingerprintManager - KeyPermanentlyInvalidatedException 未在三星中使用新指纹触发
- javascript - 返回多个模板
- php - 如何将参数从 php 传递到 linux 中的脚本?
- python - Python boto3 附加 os.env 值
- python - 在另一个模型中引用模型的单个字段?
- c++ - 如何返回输入到数组中的值的数量?
- amazon-web-services - 使用 aws_elasticache_replication_group 获取 Terraform 的端点
- java - 当字段为 LOB 时,无法从 String 转换为 Long 类型
- java - 有没有更好的方法将 xml 项添加到线性布局,以便 xml 项中的每个元素都有自己的 id?
- mongodb - 如何将 mongodb bi 连接器作为 kubernetes pod 运行