sql - Oracle XML 需要 2 行数据值,而不是 1 行 XMLTYPE
问题描述
我对 Oracle XML 很陌生,正在尝试检索 2 行 4 列的车辆数据。
SQL:
select extract(xml, 'VEHICLES/VEHICLE/NUM_VEHICLE') as NUM_VEHICLE,
extract(xml, 'VEHICLES/VEHICLE/NUM_YEAR') as NUM_YEAR,
extract(xml, 'VEHICLES/VEHICLE/DES_PLATE') as DES_PLATE,
extract(xml, 'VEHICLES/VEHICLE/CDE_STATE') as CDE_STATE
from XML_TAB_HISTORY t
where t.id = 7
XML:
<VEHICLES>
<VEHICLE>
<NUM_VEHICLE>1</NUM_VEHICLE>
<NUM_YEAR>2011</NUM_YEAR>
<DES_PLATE>ABC123</DES_PLATE>
<CDE_STATE>NJ</CDE_STATE>
</VEHICLE>
<VEHICLE>
<NUM_VEHICLE>2</NUM_VEHICLE>
<NUM_YEAR>2012</NUM_YEAR>
<DES_PLATE>XYZ987</DES_PLATE>
<CDE_STATE>NJ</CDE_STATE>
</VEHICLE>
</VEHICLES>
我得到 1 行 4 个 XMLTYPE:
<NUM_VEHICLE>1</NUM_VEHICLE>
<NUM_VEHICLE>2</NUM_VEHICLE>
<NUM_YEAR>2011</NUM_YEAR>
<NUM_YEAR>2012</NUM_YEAR>
<DES_PLATE>ABC123</DES_PLATE>
<DES_PLATE>XYZ987</DES_PLATE>
<CDE_STATE>NJ</CDE_STATE>
<CDE_STATE>NJ</CDE_STATE>
我想得到的只是两行值:
NUM_VEHICLE NUM_YEAR DES_PLATE CDE_STATE
----------- -------- --------- ---------
1 2011 ABC123 NJ
2 2012 XYZ987 NJ
我尝试在 SQL 中使用“extractvalue”代替 extract,但收到此错误:ORA-19025: EXTRACTVALUE 返回值仅一个节点。
提前感谢您提供正确方向的任何建议或指示。
安德鲁
解决方案
extract
和都已弃用extractvalue
,因此您应该使用xmlquery
and,在这种情况下,xmltable
:
select num_vehicle, num_year, des_plate, cde_state
from xml_tab_history t
cross apply xmltable (
'/VEHICLES/VEHICLE'
passing t.xml
columns num_vehicle number path 'NUM_VEHICLE',
num_year number path 'NUM_YEAR',
des_plate varchar2(6) path 'DES_PLATE',
cde_state varchar2(2) path 'CDE_STATE'
) x
where t.id = 7
NUM_VEHICLE NUM_YEAR DES_PLATE CDE_STATE
----------- -------- --------- ---------
1 2011 ABC123 NJ
2 2012 XYZ987 NJ
阅读有关当前 SQL/XML 函数的更多信息。
推荐阅读
- html - 使用 django 在 html 中调用 obj_id
- python - Flask PyMongo HTML 显示读取数据
- php - 根据php中的数组项循环替换字符串
- javascript - 如何将html与js分开?
- java - 已解决 [org.springframework.beans.TypeMismatchException String:无法将“java.lang.String”类型的值转换为所需类型
- vapor - Vapor 4 中的原始查询
- java - 汇编程序快速排序比 java array.sort 慢?
- wpf - 我如何在开始菜单中制作一个包含多个应用程序的安装程序(就像微软一样)
- ssl - Ansible,如何信任证书?
- python - 具有大稀疏矩阵的大循环的 Python 3 内存错误